簡體   English   中英

按位移位1 << 45怎么得到大整數

[英]How come I get a big int when I bitwise shift 1 << 45

為什么我會有這么大的整數?

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代碼; AFAIK他們不再使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM