2012-08-16 74 views
1

當我通過n = 0x0,我得到0xffffffff屏幕 我想到應該0x00000000 我通過32 bits (只是忽略X!我沒有內部使用它的話上移功能)。位用C移位,意想不到的結果

void logicalShift(int x, int n) { 
    int y = 32; 
    int mask = 0xffffffff; 
    printf("mask %x", mask << (y-n)); 
} 

一個有趣的一點是

void logicalShift(int x, int n) { 
    int y = 32; 
    int mask = 0xffffffff; 
    printf("mask %x", mask << 32); 
} 

這將輸出我的預期。我錯過了什麼嗎? 謝謝!

林ubuntu上

+0

確實使它'unsigned int'改變了事情嗎? – Flexo 2012-08-16 12:58:32

+0

參見http://stackoverflow.com/questions/4009885/arithmetic-bit-shift-on-a-signed-integer – 2012-08-16 12:59:12

+0

nahh ..我做了面具無符號但它不工作 – 2012-08-16 12:59:45

回答

4

左的32位的移位運行在32位的值有未定義的結果。你只能移位0到31位。

也見這裏:Why doesn't left bit-shift, "<<", for 32-bit integers work as expected when used more than 32 times?

+0

但有趣的一點是,當我做代碼顯示在下半部分,它似乎工作,它輸出0 – 2012-08-16 13:05:00

+0

@TimothyLeung這就是「未定義的結果」的意思,你不知道它會是什麼,你基本上很幸運,它在這種情況下工作。 – 2012-08-16 13:07:19

2

下面是從C11 draft §6.5.7.3相關報價;

如果右操作數的值是負的或大於或 等於推動左操作數的寬度,該行爲是 定義理解過程網絡連接。

換句話說,結果是未定義,編譯器可以自由地產生的任何結果。

+0

您在引用C++標準......問題中沒有C++,不是嗎? – 2012-08-16 13:04:47

+0

@JensGustedt更新了C11標準的相關部分,之前引用了C++標準,只是因爲我方便。 – 2012-08-16 13:09:57