可能性のある複製:
Cでの符号付きから符号なしへの変換-常に安全ですか?
タイプunsigned intの変数を宣言するとします:unsigned int x = -1;
現在、32ビットのマシンを想定して、2の補数の-1は0xFFFFFFFFです。この値をxに割り当てたときに、値0x7FFFFFFFがxに割り当てられましたか?
そうであれば、printf( "%d"、x); 0x7FFFFFFFに相当する10進数を出力しますか?ただし、出力される値は-1であるため、これは明らかに発生していません。ここで何が欠けていますか?
編集:%u形式指定子を使用して符号なしの値を出力できることを知っています。しかし、それは上記の質問に答える助けにはなりません。
"%d"
形式は(符号付き)int値用です。符号なしの値で使用すると、実際の値以外のものが出力される可能性があります。実際の値を表示するには"%u"
を使用し、16進数で表示するには%x
を使用します。
宣言で
unsigned int x = -1;
式-1
はint型で、値は-1です。初期化子は、この値をintからunsigned intに変換します。符号付きから符号なしへの変換のルールは、値がUINT_MAX + 1
を法として減らされることを示しているため、-1
はUINT_MAX
に変換されます(0xffffffff
または4294967295
は、unsigned int
が32ビットの場合)。
単純にcannot符号なし型のオブジェクトに負の値を割り当てます。そのような値は、割り当てられる前に符号なしの型に変換され、結果は常に> = 0になります。
使用する %u
の代わりに %d
符号なしの値を出力するため。次に、0xFFFFFFFFが表示されます。
何が起こっているかというと、最初に値をunsigned intに変換し、xに0xffffffffを割り当てます。次に、printf( "%d\n")を使用して、値を0xffffffffの値を維持したまま、signed intに変換します。したがって、-1を印刷します。