首先看代碼:
#include<stdio.h> #include<stdlib.h> int main(void) { int a = 5; int b = a << 32; printf("%d\n", b); system("pause"); return 0; }
對數值a進行左移32位,會得到什么結果呢?
左移跟右移不同,不用考慮填充0或者1,當將數值左移32位,填充0,按道理得到的數值應該是0對不對?
下面是運行結果:

得到的值為5,也就是a的值,這是為什么呢,將數值左移32位結果還是該數值。這是因為位移量要小於被位移數的位數,本例中被位移數為int類型,4個字節也就是32位,也就是最多能移動31位,如果超過31位就會對移動位數進行取余操作,因為32%32=0;所以得到的數值為原來數值。
但從運算符無法判斷是邏輯移位還是算術移位,可以從被移位數的類型來判斷;若x為無符號型,則為邏輯左(右)移。高(低)位移出低(高)位補零。
若x為帶符號整數:算術左移、算術右移。 左移:高位移出,低位補0。可能溢出! 溢出判斷:若移出的位不等於新的符號位,則溢出。 右移:低位移出,高位補符,可能發生有效數據丟失。
