1

なぜこんなに大きな整数を取得するのですか?

int ans = 1 << 45;
printf("Check: %d", ans);
return 0;

チェック:1858443624

4

5 に答える 5

8

これは、C では未定義の動作です。プロセッサの例外や、プログラムの他の部分での予測不可能な変更 (積極的なコンパイラの最適化の副作用として発生する可能性があります) など、あらゆることが発生する可能性があります。

6.5.7/3 [...] 右オペランドの値が負の場合、または昇格された左オペランドの幅以上の場合、動作は未定義です。

ソース

于 2012-08-31T20:07:14.957 に答える
2

C標準によると

式は、負の数だけ、またはプロモートされた式の幅以上の量だけシフトされます (6.5.7)。

は未定義の動作であるため、コンパイラはここで指定したコードに対して自由に何でも実行できます。

于 2012-08-31T20:07:38.133 に答える
2

90? とんでもない。ビットシフトが何をするかを読む必要があります。1<<45 あくまで中古品2^45です。また、int31 ビット (符号ビットを除く) しかないため、45 ビットをシフトしようとすると、未定義の動作が発生します。

簡単な例:

1 << 0  =  1  = 0x01  = 00000001b
1 << 1  =  2  = 0x02  = 00000010b
1 << 2  =  4  = 0x04  = 00000100b
1 << 3  =  8  = 0x08  = 00001000b
于 2012-08-31T20:07:47.193 に答える
1

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

どうやら、彼らは結果をランダム化します:-)

于 2012-08-31T20:14:26.267 に答える
0

1)誰もがすでに言ったように、答えは「未定義の動作」です。

2)実際には、私がよく知っているほぼすべてのコンパイラが「0」を返します。

3) 実際には、ほとんどの自尊心のあるコンパイラも警告を出します:

x.cpp: In function `int main (int, char **)':
x.cpp:7: warning: left shift count >= width of type
于 2012-08-31T20:11:47.780 に答える