我目前正在C中嘗試按位操作,我試圖理解爲什麼此代碼爲變量a
和變量b
打印不同的值。 我知道32位移位溢出1變量(這是一個正常的int),但我的理解是,它應該在兩種情況下打印0。C按位操作的行爲
取而代之的是,它使用unsigned int a
和unsigned long int b
來打印一個隨機數。
#include <stdio.h>
int main(){
printf("%lu %lu\n",sizeof(int), sizeof(long int));
unsigned int a = 1 << 32;
unsigned long int b = 1 << 32;
printf("%u %lu\n", a, b);
return 0;
}
輸出示例:
4 8
374588997 0
我缺少什麼?
編輯
現在我有一個31位的移位只是想,編譯器給了我沒有警告。 來源:
#include <stdio.h>
int main(){
int shift = 31;
unsigned long int b = 1 << shift;
printf("%lu\n", b);
return 0;
}
,並將其輸出18446744071562067968
,那真的不是2^31。任何線索?
如果是[未定義行爲是移位大小大於或等於位長度](https://stackoverflow.com/questions/19636539/arithmetic-right-shift-gives-bogus-result/19636588 #19636588)。 –
好的,但爲什麼它會在兩個操作之間給出不同的結果?表達仍然是相同的:1 << 32,LHS改變但表達式應該已經被評估。 –
因爲鼻子惡魔。 http://www.catb.org/jargon/html/N/nasal-demons.html – thejh