C++ 是#包括<;限制>;跨平台?

C++ 是#包括<;限制>;跨平台?,c++,c++11,C++,C++11,如果我要做: int imin = std::numeric_limits<int>::min(); int imax = std::numeric_limits<int>::max(); 引发问题;比如说在32位机器上?它们依赖于实现,标准将int定义为至少与短一样长,并且至少有16位。其他一切都由实施部门自行决定。现在,您通常会看到整数为32位。 很难说它是否会引起问题,这取决于细节。您可以安全地使用16位的值。通常,手工定义自己的限制不是一个好主意 老实说,最

如果我要做:

int imin = std::numeric_limits<int>::min(); 
int imax = std::numeric_limits<int>::max();

引发问题;比如说在32位机器上?

它们依赖于实现,标准将int定义为至少与短一样长,并且至少有16位。其他一切都由实施部门自行决定。现在,您通常会看到整数为32位。

很难说它是否会引起问题,这取决于细节。您可以安全地使用16位的值。通常,手工定义自己的限制不是一个好主意


老实说,最好的办法是#包括cstdint,只需使用固定大小的类型,例如int32_t,它必须是特定大小

这些值取决于实现(请参阅
std::numeric_limits
的文档),但是,标准保证它们能够表示不超过某个值的值(有关具体细节,请参阅)

只要常数在该类型允许的可表示值范围内,使用自己的常数就不会引起问题。在您的示例中,
MAX_UNSIGNED_SHORT
MAX_UNSIGNED_64LONG
的值都在各自类型的值范围内。他们应该没事

另一方面,如果使用类型,
std::numeric_limits::max
的结果在特定类型的实现中应该保持不变。(例如,
std::numeric_limits::max()
将跨平台返回相同的值,
std::numeric_limits::max()
将跨平台返回相同的值,但
std::numeric_limits::max()!=std::numeric_limits::max()

然而,正如@rci所指出的,根据标准,固定宽度类型是可选的,因此不能保证它们在所有实现中都存在

>您可以考虑在 StDINT.H./COD>中使用固定宽度类型的类型和限制宏。它们在“它们总是可以存储在<代码> INT/COME >中的最大值和最小值”的意义上是跨平台的。您在它们的值中看到的任何变化都是因为
int
具有实现定义的方面。不要求int(至少)为short的大小,也不要求它至少为16位。该标准规定了类型必须能够表示的(最小)范围。这些范围对应于16个逻辑位或二进制硬件上的16个物理位(使用晶体管实现)。然而,标准中并没有任何东西阻止在非二进制机器上实现。@Peter:我不打算进入非二进制机器。对于广泛关注的实现,有符号ness+大小直接转换为整数范围。更有趣的是,尽管你写到int至少是short的大小是没有要求的。这是一个吹毛求疵的说法,还是你真的认为int的值范围不一定是char的超集?如果是后者,你能提供一个来源吗?@Peter:这些说法大部分都不正确。3.9.1/2保证int至少与short int一样长。3.9.1/7规定了二进制(“整数类型的表示应使用纯二进制计算系统定义值”。)两点。首先,对于无符号整数,可以很好地定义环绕运算。因此,使用与真值不同的最大值或最小值实际上会破坏程序逻辑。第二,您写了“即使底层类型没有”。这到底是什么意思?
std::numeric\u limits::max()
将在定义了
uint16\u t
的每个平台上返回相同的值。这是一种可选类型,请参见18.4.1
uint\u least16\u t
是必需的类型,但它没有一致的
max
值。
uint16\u t
的“基础类型”有16位。如果没有这样的类型,
uint16\u t
将不存在。@NirFriedman我指的是固定宽度类型内部使用的类型。例如,
uint16\u t
可以在内部使用short表示,但也可以是
int
,并且在实现之间可能会发生变化。即便如此,我还是从答案中删除了这一部分,以减少混淆。
  static unsigned short MAX_UNSIGNED_SHORT = 65535;
  static uint64_t MAX_UNSIGNED_64LONG = 18446744073709551615u;