先備知識:
關於負數是如何在內存中是如何存儲的?
在計算機內存當中,負數一律按照補碼的形式進行存儲,例如現在有一個負數-10
-10的二進制原碼形式為
[1000 1010]2 這個地方需要注意的是高位為符號位,即當這個數字是負數的時候高位為1,正數時高位為0,且符號為不計入數值當中,只能表示正負數的概念。
當-10存入計算機當中的時候,內存中需要對負數的原碼進行按位取反加一的操作,即進行求補碼的操作;特別注意,符號位不參與變化
[1111 0110]2
當需要將負數從內存當中取出的時候,首先需要將補碼轉化成原碼,轉變規則為對當前的補碼取反加一(其中符號為不參與變化),轉變的原碼為:
[1000 1010]2
負數左移位運算相關操作:
以-10舉例首先進行左移2位運算(-10<<2):
1)-10的補碼形式為:
[1111 0110]2
2)向左移動2位,右端補0得到新的補碼為:
[1101 1000]2
3)將當前補碼從內存中取出,取出時需要將補碼轉化成原碼形式:
[1010 1000]2
4)通過換算可得[2 8]16加上符號即為[-40]10
負數右移位運算相關操作:
仍然是以-10來舉例,將-10右移2位(-10>>2):
1)確定-10的補碼形式為:
[1111 0110]2
2)向右移動2位,高位補符號位,說人話就是符號位是幾就補幾:
[1111 1101]2
3)轉化為原碼形式取出(取反加一,符號位為不動):
[1000 0011]2
4)計算出來的結果為[0 3]16加上符號得出[-3]10
總結:
左移運算一律在右端補0,右移運算一律在左端補符號數(負數符號位為1就補1,正數符號位為0就補0)
特別注意的是:
負數是不能在原碼的基礎上進行操作的,需要首先轉化成補碼才能進行移位運算,並且運算的結果並不是直接結果,還是需要將其轉化為原碼才能當做運算結果輸出!
其中不要忘記了加上負號!
補:
特別注意溢出問題:負數移位溢出之后的值一律為-1,正數移位溢出之后的值一律為0
有時間再補上溢出問題。