[英]When I do bitwise flip operation in C on integer 1, I get -2 and not 4294967294, how can I get 4294967294?
[英]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.