如何保证C++类型的位数

Eph*_*era 2 c++ types cross-platform typedef

我正在寻找typedef我自己的算术类型(例如Byte8,Int16,Int32,Float754等),目的是确保它们包含特定数量的位(并且在浮点数的情况下,遵循IEEE754格式).我怎样才能以完全跨平台的方式做到这一点?

我已经在这里和那里看到了C/C++标准的片段,并且有很多:

" 类型至少 X字节"

并不是很多:

" 类型恰好 X字节".

鉴于这typedef Int16 unsigned short int可能不一定会导致16位Int16,是否有一种跨平台的方式来保证我的类型将具有特定的大小?

nog*_*ard 9

您可以使用int8_t, int16_t, int32_t, int64_t声明的精确宽度整数类型<cstdint>.这样,所有平台上的尺寸都是固定的

  • ...提供它们的所有平台.如果平台没有*(例如)一个16位类型,那么它就不会有`int16_t`. (3认同)

Jer*_*fin 5

真正保证精确位数的唯一可行方法是使用位域:

struct X { 
    int abc : 14; // exactly 14 bits, regardless of platform
};
Run Code Online (Sandbox Code Playgroud)

您可以通过这种方式指定大小的上限 - 至少16位int,32位long(但现代平台可能很容易允许最多64位).但请注意,虽然这可以保证算术开启X::abc将使用(或至少模拟)恰好14位,但它并不能保证a的大小struct X是提供14位所需的最小字节数(例如,给定8位)字节,它的大小很容易是4或8而不是绝对必要的2.

C和C++标准现在都包含固定大小类型的规范(例如int8_t,int16_t),但不保证它们将存在.如果平台提供正确的类型,则需要它们,否则将不存在.如果存储器服务,则还需要使用2的补码表示,因此具有16位1的补码整数类型的平台(例如)仍然不会定义int16_t.