为什么numeric_limits <int> :: min()的定义不同?</int>

时间:2010-02-22 22:12:35

标签: c++ stl

要检索最小值,我必须使用numeric_limits<int>::min()

我想最小的int是-2147483648,我机器上的测试显示了这个结果。 但是一些C ++引用如Open Group Base Specificationscplusplus.com使用值-2147483647定义它。

我问这个问题是因为我实施了negaMax框架(游戏树搜索) 必须明确定义值最小整数 *( - 1)。 是的,使用 minimal int =(numeric_limits :: min()+ 2)无论如何我都是安全的, 因此,我的问题在理论上更为正确,但我认为非常有趣。

5 个答案:

答案 0 :(得分:4)

如果一个值表示为符号和幅度而不是二进制补码,则符号位为1,其他所有位为零等于-0。在符号和幅度中,最大正整数和负整数具有相同的幅度。二进制补码能够代表一个负值,因为它没有相同的对称性。

答案 1 :(得分:3)

numeric_limits<int>::min()的值由实现定义。这就是为什么它可能会有所不同。你不应该坚持任何具体的最低价值。

答案 2 :(得分:1)

在cplusplus.com上,您忘记阅读限定符

分钟。大小*

  • 这不一定是任何特定编译器或系统中常量的实际值,它的大小可能等于或大于此。

答案 3 :(得分:0)

从您发布的cplusplus.com链接(强调我的):

  

以下面板显示了不同的常数及其保证的最小幅度(正数值可能更大,负数值可能更小)。 任何特定的编译器实现都可以定义比此处显示的更大幅度的整数类型

数字限制始终是系统和编译器定义的,尝试使用64位编译器和系统运行,您可能会看到完全不同的数字。

答案 4 :(得分:0)

c ++对有符号整数使用二进制补码。因此,最小的有符号整数由100..00(通常为32位)定义。

简单地移动1<<(sizeof(int)*8-1)应该给出最小的有符号整数。

显然对于无符号整数,最小值为0.

编辑:您可以阅读更多here
edit2:显然C ++不一定使用二维恭维,我的错误