原碼、反碼、補碼及移位運算


同學面試時被問到一個問題:-1右移兩位是幾呢,然后在他思考期間,面試官露出了奇怪的表情……所以趕快復習一下機器碼及移位的相關知識


首先介紹一下概念與規則:

1、一般書寫表示的數叫做真值,真值在計算機中的表示方式叫做機器碼。

2、正整數用原碼、反碼、補碼三種方式表示時完全一樣,比如1(int型占4位)的原碼、反碼、補碼都為00000000 00000000 00000000 00000001。

3、負整數用原碼、反碼、補碼表示時,符號為都為1,用二進制表示的數值位各不相同。原碼符號位為1不變,數值位按位取反得到反碼,反碼符號位不變,最低位加1得到補碼。例如-1的原碼為10000000 00000000 00000000 00000001,反碼為11111111 11111111 11111111 11111110,補碼為11111111 11111111 11111111 11111111

4、為什么機器碼要用補碼表示呢?  用補碼表示可以將減法運算轉化為加法運算,這樣在計算機中運算時比較方便,不論數是正是負,機器總是做加法。如1-1在計算機中是00000000 00000000 00000000 00000001 + 11111111 11111111 11111111 11111111 = 00000000 00000000 00000000 00000000 = 0


移位運算:

"<<"左移:右邊空出的位置補0,左移一位相當於乘以2。1左移一位即為00000000 00000000 00000000 00000001左移一位為00000000 00000000 00000000 00000010,為2。左移時符號位也會移動。例如1向左移動31位即00000000 00000000 00000000 00000001左移變為10000000 00000000 00000000 00000000,因此1左移31位變為int類型的最小值-2147483648。-1左移一位即11111111 11111111 11111111 11111111左移變為11111111 11111111 11111111 11111110,即為-2。

">>"右移:左邊空出的位,如果是正數則補0,若為負數則補0或1,取決於所用的計算機系統,其值相當於除以2。1右移一位即00000000 00000000 00000000 00000001變為00000000 00000000 00000000 00000000,即為0。-1右移一位即11111111 11111111 11111111 11111111右移1位為11111111 11111111 11111111 11111111,即為-1。

如果左移或右移的位數超過了該數值類型的最大位數怎么辦呢?編譯器會用左移或右移的位數去模類型的最大位數,然后按余數進行一位操作。即:

1>>32表示為1>>(32-32) = 1>>0 = 1; 1>>33表示為1>>(33-32) = 1>> 1 = 00000000 00000000 00000000 00000001 >> 00000000 00000000 00000000 00000000=0

-1<<32表示為1<<(32-32) = 1 << 0 = 1; 1<< 33表示為1<<(33-32) = 1<< 1 = 00000000 00000000 00000000 00000001<<00000000 00000000 00000000 00000010=2

 


免責聲明!

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



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