C言語を勉強中の者です。
次のようなサンプルコードを書いてみたのですが、予想と違う結果になりました。
C
1#include <stdio.h> 2 3int main( void ) 4{ 5 printf( "%d\n", 0xffffffff == -1 ); 6 7 printf( "%ld\n", ( long ) -1 ); 8 printf( "%ld\n", ( long ) 0xffffffff ); 9 10 return 0; 11}
GCCでコンパイルした際の実行結果です。
1 -1 4294967295
( long ) 0xffffffffが-1ではなく、4294967295になる理由が分かりません。
0xffffffffはint型でMSBが1なので、負と解釈され、符号拡張されると思ったのですが、ゼロ拡張されています。
考えたのは、16進数リテラルはint型ではなく、unsigned int型なのではないかということです。もしくは、基本的にはint型だが、何らかの理由でunsigned int型に型変換されたのではないかということです。unsigned int型ならば、ゼロ拡張されるのも納得がいきます。
この辺のことをご存じの方がいましたら、仕様ではこうなっている等の理由を教えていただければ助かります。よろしくお願いします。
回答8件
あなたの回答
tips
プレビュー