原碼,反碼,補碼是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;
第一次寫,毫無章法,有些的遺漏之處,萬望指出.