c 語言中負數移位運算講解
「<<」、「>>」為移位運算子。 「<<」為左移位運算子,即資料位元組中的每個二進位制位同時
向左移位。如「x<>」為右移位運算
符,即資料位元組中的每個二進位制位同時向右移位。如「x>>n」表示 x 中的每個二進位制位同時
向右移動 n 位。
下圖演示了乙個 2 位元組變數左移 3 位的過程:
十進位制數-555 的二進位製表:
1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1
先轉換成二進位制補碼表:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0
最左端位保持不變 補碼加「1」後狀態
再將補碼加「1」:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1
下一步向左移 3 位:
1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0
左端「離開」3 位丟棄 右端「移入」3 位用「0」補齊
最左端一位保持不變
再轉換成二進位制補碼表:
1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1
補碼再加「1」:
到此步結束。
1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0
補碼加「1」後狀態
結果轉換成十進位制數為「- 4440」。
總結:負數左移時,任何情況下「移入」位將用「0」補齊。
「>>」右移位運算可分為兩種情況:一種是移入「0」的叫邏輯右移;一種是移入「1」的叫
算術右移。 負數右移用到的是算術右移。
下圖演示了乙個 2 位元組變數右移 3 位的過程:
十進位制數-555 的二進位製表:
1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1
先轉換成二進位制補碼表:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0
最左端位保持不變 補碼加「1」後狀態
再將補碼加「1」:
1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1
下一步向右移 3 位:
1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0
左端「移入」3 位用「1」補齊 右端「離開」3 位丟棄
最左端一位保持不變
再轉換成二進位制補碼表:
1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1
補碼再加「1」:
到此步結束。
1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
補碼加「1」後狀態
結果轉換成十進位制數為「- 70」。
總結:負數右移時,任何情況下「移入」位將用「1」補齊。
注:二進位製表最左端的二進位制位表示符號位,「+」用「0」表示,「-」用「1」表示。
c語言負數左移右移 C語言負數的移位運算
在c 中左移也就是所說的邏輯移位,右端補,而右移是算數移位,左端補齊的是最高位 的符號位。故負數左移,有可能變成正數,但負數右移,肯定還是負數。用進製的形式對資料進行賦值 這進製的數代表的是補碼。i 0xfffffff7 0xfffffff7 是補碼,而不是原碼,故 i 9 printf d x n...
C語言中位移位運算子
位移位運算子是將資料看成二進位制數,對其進行向左或向右移動若干位的運算。位移位運算子分為左移和右移兩種,均為雙目運算子。第一運算物件是移位物件,第二個運算物件是所移的二進位制位數。位移位運算子的運算物件 運算規則與結果 結合性如表2 16所示。移位時,移出的位數全部丟棄,移出的空位補入的數與左移還是...
C語言中位移位運算子
位移位運算子是將資料看成二進位制數,對其進行向左或向右移動若干位的運算。位移位運算子分為左移和右移兩種,均為雙目運算子。第一運算物件是移位物件,第二個運算物件是所移的二進位制位數。位移位運算子的運算物件 運算規則與結果 結合性如表2 16所示。移位時,移出的位數全部丟棄,移出的空位補入的數與左移還是...