java之原反補

原碼,反碼,補碼是java數值運算的基礎,在計算機程序中,數值運算是基於二進制的,也就是說底層是二進制運算.而數值有正數與負數,二進制只有0和1,如何表示負數,如何進行正負數的運算,這就是原反補的意義所在.
基礎定義:
  * 原碼
    * 就是二進制定點表示法,即最高位爲符號位,“0”表示正,“1”表示負,其餘位表示數值的大小。
    * 通過一個字節,也就是8個二進制位表示+7和-7
    * 0(符號位) 0000111
    * 1(符號位) 0000111
  * 反碼
    * 正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
  * 補碼
    * 正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。 
 
而在有符號數值運算過程中,運算都是基於補碼來運算的,所以說,求補碼是理清有符號運算的根本.
案例:
-4+3的運算原理:
3  的二進制:     0 (符號位) 0000011(源碼)
      0  (符號位) 0000011(反碼)
      0  (符號位) 0000011(補碼)
-4的二進制:     1  (符號位) 0000100(源碼)  
                            1  (符號位) 1111011(反碼)
                            1  (符號位) 1111100(補碼)   
    0  (符號位) 0000011(補碼)
+  1  (符號位) 1111100(補碼)   
-------------------------------------------
    1  (符號位) 1111111(補碼)
-                                    1
-------------------------------------------
    1  (符號位) 1111110(反碼)
取反
-------------------------------------------
   1  (符號位) 0000001(原碼)
 
轉爲10進製爲-1,也就是計算的結果.
 
在java中,除了在有符號數值運算中用到原反補,在數據的強制類型轉換也有用到,
例如:
byte a = (byte)300;//byte的範圍是-128~127 ,而300超過,需要進行強制轉換.

300的二進制形式是:00000000  00000000  00000001  00101100

強制轉換(截取)後爲: 00101100    //此時爲補碼形式

而此時最高符號位爲0,即爲正數,而正數的原反補是相同的,所以最後a的值爲44;

 

第一次寫,毫無章法,有些的遺漏之處,萬望指出.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章