なぜこんなに大きな整数を取得するのですか?
int ans = 1 << 45;
printf("Check: %d", ans);
return 0;
チェック:1858443624
なぜこんなに大きな整数を取得するのですか?
int ans = 1 << 45;
printf("Check: %d", ans);
return 0;
チェック:1858443624
これは、C では未定義の動作です。プロセッサの例外や、プログラムの他の部分での予測不可能な変更 (積極的なコンパイラの最適化の副作用として発生する可能性があります) など、あらゆることが発生する可能性があります。
6.5.7/3 [...] 右オペランドの値が負の場合、または昇格された左オペランドの幅以上の場合、動作は未定義です。
C標準によると
式は、負の数だけ、またはプロモートされた式の幅以上の量だけシフトされます (6.5.7)。
は未定義の動作であるため、コンパイラはここで指定したコードに対して自由に何でも実行できます。
90? とんでもない。ビットシフトが何をするかを読む必要があります。1<<45
あくまで中古品2^45
です。また、int
31 ビット (符号ビットを除く) しかないため、45 ビットをシフトしようとすると、未定義の動作が発生します。
簡単な例:
1 << 0 = 1 = 0x01 = 00000001b
1 << 1 = 2 = 0x02 = 00000010b
1 << 2 = 4 = 0x04 = 00000100b
1 << 3 = 8 = 0x08 = 00001000b
clang(X-Codeで使用されているように;私の知る限り、gccはもう使用していません)はこれで面白いです:
stieber@gatekeeper:~$ clang Test.c -Wno-shift-count-overflow; ./a.out
Check: -1344872728
stieber@gatekeeper:~$ clang Test.c -Wno-shift-count-overflow; ./a.out
Check: -1066238232
stieber@gatekeeper:~$ clang Test.c -Wno-shift-count-overflow; ./a.out
Check: -1373126936
stieber@gatekeeper:~$ clang Test.c -Wno-shift-count-overflow; ./a.out
Check: 779153128
どうやら、彼らは結果をランダム化します:-)
1)誰もがすでに言ったように、答えは「未定義の動作」です。
2)実際には、私がよく知っているほぼすべてのコンパイラが「0」を返します。
3) 実際には、ほとんどの自尊心のあるコンパイラも警告を出します:
x.cpp: In function `int main (int, char **)':
x.cpp:7: warning: left shift count >= width of type