基本介紹
移位運算符的一種:
C語言中位移位運算符
位移位運算符
位移位運算符是将數據看成二進制數,對其進行向左或向右移動若幹位的運算。位移位運算符分為左移和右移兩種,均為雙目運算符。第一運算對象是移位對象,第二個運算對象是所移的二進制位數。
位移位運算符的運算對象、運算規則與結果、結合性所示。
移位時,移出的位數全部丢棄,移出的空位補入的數與左移還是右移有關。如果是左移,則規定補入的數全部是0;如果是右移,還與被移位的數據是否帶符号有關。若是不帶符号數,則補入的數全部為0;若是帶符号數,則補入的數全部等于原數的最左端位上的原數(即原符号位)。具體移位規則如下所示。
位移位運算符的優先級如下:
算術運算符優先于位移位運算符優先于關系運算符
位移位運算符是同級别的,結合性是自左向右
舉例
先說左移,左移就是把一個數的所有位都向左移動若幹位,在C中用<<運算符.例如>運算符.例如
也就是說,1的2進制是000...0001(這裡1前面0的個數和int的位數有關,32位機器,gcc裡有31個0),左移2位之後變成000...0100,也就是10進制的4,所以說左移1位相當于乘以2,那麼左移n位就是乘以2的n次方了(有符号數不完全适用,因為左移有可能導緻符号變化,下面解釋原因)
需要注意的一個問題是int類型最左端的符号位和移位移出去的情況.我們知道,int是有符号的整形數,最左端的1位是符号位,即0正1負,那麼移位的時候就會出現溢出,例如:
那麼,i在左移1位之後就會變成0x80000000,也就是2進制的100000...0000,符号位被置1,其他位全是0,變成了int類型所能表示的最小值,32位的int這個值是-2147483648,溢出.如果再接着把i左移1位會出現什麼情況呢?在C語言中采用了丢棄最高位的處理方法,丢棄了1之後,i的值變成了0.
左移裡一個比較特殊的情況是當左移的位數超過該數值類型的最大位數時,編譯器會用左移的位數去模類型的最大位數,然後按餘數進行移位,如