標籤:如何 強制轉換 數值 -128 log 符號 二進位 基於 源碼
原碼,反碼,補碼是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;
第一次寫,毫無章法,有些的遺漏之處,萬望指出.
java之原反補