右移位和左移位不同,一共有兩種方案:一種是邏輯移位,左邊移入的位用0填充;另一種是算術移位,左邊移入的位由原先該值的符號位決定,符號位爲1則移入的位均爲1,符號位爲0則移入的位均爲0,這樣能夠保證原數的正負形式不變。如果值10010110右移兩位,邏輯移位的結果是00100101,但算術移位的結果是11100101.算術左移和邏輯左移是相同的,他們只在右移時不同,而且只有當操作數是負值時纔不一樣。標準說明無符號值執行的所有移位操作都是邏輯移位,但對於有符號值到底是採用邏輯移位還是算數移位取決於編譯器。我們可以通過測試程序來測試當前編譯器使用的是什麼方式。一個程序如果使用了負數的右移位操作,那麼這個程序就是不可移植的。
#include <stdio.h>
int main(int argc, char *argv[])
{
char a = -8;
printf("0x%hhx\n",a);
a = a >> 3;
printf("0x%hhx\n",a);
return 0;
}
程序結果如下所示:
由此可知,本編譯器使用的是算術移位
備註:
%hhx用於輸出char
%hx用於輸出short int.
%x用於輸出int