【发布时间】:2012-01-20 15:32:38
【问题描述】:
在 Visual Studio 2010 上以下程序
#include <iostream>
using std::cout;
int main()
{
cout << -2147483646 << '\n';
cout << -2147483647 << '\n';
cout << -2147483648 << '\n'; // numeric_limits<int>::min()
cout << -2147483649 << '\n';
cout << -2147483650 << '\n';
cout << "..." << '\n';
cout << -4294967293 << '\n';
cout << -4294967294 << '\n';
cout << -4294967295 << '\n'; // -numeric_limits<unsigned int>::max()
cout << -4294967296 << '\n';
cout << -4294967297 << '\n';
}
生成以下输出
-2147483646
-2147483647
2147483648
2147483647
2147483646
...
3
2
1
-4294967296
-4294967297
发生了什么事?
这是标准行为还是 Visual Studio 错误?
编辑:正如一些人所指出的,没有负整数文字这样的东西。有关详细信息,请参阅下面的 Keith Thompson 的出色回答。
【问题讨论】:
-
有趣,这里是反汇编:cout
-
std::cout的流操作符可能没有像您期望的那样推广这些文字。 -
@ScarletAmaranth 我认为没关系,因为 4294967293 首先被读取为无符号整数,然后被取反,结果为 3。虽然不太确定
-
@drhirsch:他没有使用
numeric_limits<int>::min()他使用的是硬编码文字,这将是编译器默认使用的任何文字。 -
他把
numeric_limits写成cmets来明确编译器使用什么,他的值是正确的
标签: c++