计算机基础——原码、反码、补码转换
文章目錄
- 說明
- 概念
- 示例
- 計算機中二進制為什么使用補碼表示
說明
在看JDK源碼的過程中,可以看到很多關于位運算的內容,位運算當然涉及計算機中二進制數字的存儲方式以及值之間的轉換,本文介紹一下二進制的三種表示方式:原碼、反碼、補碼。
概念
原碼: 將最高位作為符號位(0表示正,1表示負),其它數字位代表數值本身的絕對值。
反碼:正數的反碼和原碼相同。如果是負數,則將原碼符號位不變,其余各位取反,得到的就是負數的反碼。
補碼:正數的補碼和原碼相同。如果是負數,則將原碼符號位不變,其余各位取反,然后將得到的數值加1(負數的補碼也可以理解成反碼加1)。
示例
通過上面的介紹,我們已經知道了幾種二進制碼之間的關系,下面用一個示例更直觀表示一下。為了計算方便起見,假設計算機存儲的是8位下的值。
| +127 | 0111 1111 | 0111 1111 | 0111 1111 |
| +1 | 0000 0001 | 0000 0001 | 0000 0001 |
| +0 | 0000 0000 | 0000 0000 | 0000 0000 |
| -0 | 1000 0000 | 1111 1111 | 0000 0000 |
| -1 | 1000 0001 | 1111 1110 | 1111 1111 |
| -127 | 1111 1111 | 1000 0000 | 1000 0001 |
總結一下:
計算機中二進制為什么使用補碼表示
這里面牽扯到一個很重要的計算方式模運算。通過模運算實現化減為加,本質上是將溢出的部分舍去而不改變計算結果。
8位運算的模為256=2^8。
在無符號位的情況下:127+2=129
129超出了8位運算的最大表示范圍,所以上面的二進制的結果1000 0001表示的轉換為原碼為1111 1111即為-127。意思就是說129在計算機中的表示和-127是一樣的,就像是時鐘過了12點重新從0點開始了,超過了最大的數就從最小的數開始,256類似于時鐘的一圈。
這里我們可以得出結論:負數的補碼為模減去該數的絕對值
以-3為例:
-3原碼:1000 0011
-3反碼:1111 1100
-3補碼:1111 1101
使用模運算計算結果:-3=256-3=253=1111 1101(二進制)
根據下面的例子我們看一下補碼是如何化減為加的
127-3=127+(-3)=124=0111 1100(二進制)
由于我們存儲的是8位,因此溢出舍棄得到的是0111 1100=124(十進制),因此補碼的化減為加核心是通過溢出舍棄操作來完成的。
總結
以上是生活随笔為你收集整理的计算机基础——原码、反码、补码转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中的“”、“|”、“^”、“~”
- 下一篇: BlockingQueue常用方法add