[英]How to guarantee a C++ type's number of bits
我希望typedef
我自己的算术类型(例如Byte8,Int16,Int32,Float754等),目的是确保它们包含特定数量的位(并且在浮点数的情况下,遵循IEEE754格式)。 我怎样才能以完全跨平台的方式做到这一点?
我已经在这里和那里看到了C / C ++标准的片段,并且有很多:
“ 类型 至少是 x个字节”
并不是很多:
“ 类型 正好是 x个字节”。
鉴于typedef Int16 unsigned short int
可能不一定会产生16位Int16,是否有一种跨平台的方式来保证我的类型具有特定的大小?
您可以使用<cstdint>
声明的精确宽度整数类型int8_t, int16_t, int32_t, int64_t
。 这样,所有平台上的尺寸都是固定的
真正保证精确位数的唯一可行方法是使用位域:
struct X {
int abc : 14; // exactly 14 bits, regardless of platform
};
您可以通过这种方式指定大小的上限 - int
至少为16位, long
为32位(但现代平台可能很容易允许最多64位)。 但请注意,虽然这可以保证X::abc
上的算术将使用(或至少模拟)恰好14位,但它并不能保证struct X
的大小是提供14位所需的最小字节数(例如,给定8位字节,其大小可以很容易地为4或8而不是绝对必要的2。
C和C ++标准现在都包含固定大小类型的规范(例如, int8_t
, int16_t
),但不保证它们将存在。 如果平台提供正确的类型,则需要它们,否则将不存在。 如果内存服务,则还需要使用2的补码表示,因此具有16位1的补码整数类型的平台(例如)仍然不会定义int16_t
。
这是不可能的。
有些平台的char
是16位甚至32位。
请注意,我并不是说在理论平台上会发生这种情况......这是一种真实且非常具体的可能性(例如DSP)。
在那种硬件上,没有办法仅将8位用于操作,例如,如果您需要8位模运算,那么唯一的方法就是自己进行屏蔽操作。
C语言不为你提供这种模拟......
使用C ++,您可以尝试在大多数情况下构建一个行为类似于预期的
本机
基本类型的类(显然排除了sizeof
)。 结果将会有真正可怕的表现。
我可以认为没有任何用例强迫硬件以这种方式反对其性质是一个好主意。
可以在编译时使用C ++模板来动态检查和创建符合您要求的新类型,特别是sizeof()
是您想要的正确大小。
看看这段代码: 编译时间“如果” 。
请注意,如果请求的类型不可用,那么您的程序完全可能无法编译。 这取决于它是否适合你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.