私は、これは非常に大きな数と同じ数を印刷するように期待していた-1が、それだけで印刷し-1および-2、これはなぜですか?cこれはなぜ、負の数値を出力するのですか?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
私は、これは非常に大きな数と同じ数を印刷するように期待していた-1が、それだけで印刷し-1および-2、これはなぜですか?cこれはなぜ、負の数値を出力するのですか?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
%d
の形式は符号付き整数(10進数)です。整数は上位ビット(8000 0000)は、話すの方法で、値の符号を示すことを意味し、two's complementを使用して格納されています。 3からカウントダウン
、値は次のとおりです。
0000 0003 = 3
0000 0002 = 2
0000 0001 = 1
0000 0000 = 0
FFFF FFFF = -1
FFFF FFFE = -2
など
あなたはFFFF FFFFが%u
(符号なし)の形式を使用し、大きな正の数として表示したい場合。あなたが言及
値が-1と-2
2の補数表現は、符号付き整数の最初のビットは符号であるので、記憶されていることができる最大数であるtwo's complement
をルックアップしています0xEFFFFFFF。
引数「%dは」符号付き整数として入力を印刷します。その結果、two's complement representationが見つかりました。代わりに "%u"と考えてください。
ああ、いただきました!%長いため?または署名されていない? – user105033
%のU - ちょうど応答に追加:) –
INTは、%D、符号なしは%Uであり、長いintは長い符号なし%のLDでない、%dは符号付き10進数を意味%のLU –