關於負數的左右位移運算


先備知識:

關於負數是如何在內存中是如何存儲的?

在計算機內存當中,負數一律按照補碼的形式進行存儲,例如現在有一個負數-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

有時間再補上溢出問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM