10
次のプログラム大きな負の整数リテラル
#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の優れた答えをご覧ください。私はGCCでこれをコンパイルすると
興味深いことに、ここでは逆アセンブリです:cout << -4294967293 << '\ n'; push 0Ah mov esi、esp push 3 すぐに直ちに3が押されることに注意してください。 (VS2010 ultimate) – ScarletAmaranth
'std :: cout'のストリーム演算子は、あなたが期待しているリテラルをおそらく宣伝していません。 – AJG85
@ScarletAmaranth 4294967293はunsigned intとして最初に読み込まれ、negatedよりも3が得られるので、これは大丈夫だと思います。 – hirschhornsalz