看這個樣品C代碼(提取的測試情況爲例):無法理解移位運算符行爲在C代碼
main() {
unsigned long a, b;
int c;
c = 32;
a = 0xffffffff << 32;
b = 0xffffffff << c;
printf ("a=%x, b=%x\n", a, b);
}
打印:a=0, b=ffffffff
我無法理解爲什麼b不是零,就像一個。我在Microsoft C和GCC上進行了測試。
更新:我固定的愚蠢錯字(應該是< < c和當然不是< < B)。但我的問題仍然存在,例如結果仍然是一樣的。
Downvoter,你能解釋一下爲什麼downvoted? – ouah 2012-01-30 21:52:10
您爲問題的第一部分提供了大量細節,但沒有解釋部分b。 – BitBank 2012-01-30 22:32:34
@BBBank因爲部分'a'和部分'b'是相同的問題(相同的左移是執行)與相同的解釋。在'a'和'b'賦值的RHS中的兩個表達式都是未定義的行爲。由於它是未定義的行爲,所以'a'和'b'的結果可能是相同的或者可能不同,或者程序可以將'rm -rf'作爲根分區。當然,我們可以觀察到不同的編譯啓發式,因爲在第一種情況下,常量被用作轉換的右操作數,但這是不相關的。 – ouah 2012-01-30 22:38:20