2011-12-14 13 views
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でこれをコンパイルすると

+0

興味深いことに、ここでは逆アセンブリです:cout << -4294967293 << '\ n'; push 0Ah mov esi、esp push 3 すぐに直ちに3が押されることに注意してください。 (VS2010 ultimate) – ScarletAmaranth

+0

'std :: cout'のストリーム演算子は、あなたが期待しているリテラルをおそらく宣伝していません。 – AJG85

+0

@ScarletAmaranth 4294967293はunsigned intとして最初に読み込まれ、negatedよりも3が得られるので、これは大丈夫だと思います。 – hirschhornsalz

答えて