?前言
本博客文章已收錄至我的Java SE專欄,如需閱讀其他有關博客筆記請轉至該專欄下
傳送門 -->Java SE_程序員雨空集
目錄
?前言
原碼
原碼的示例
原碼的弊端
反碼
反碼的示例
反碼的弊端
補碼
補碼的示例
補碼的小細節(jié)
總結
原碼
原碼:十進制數(shù)據的二進制表現(xiàn)形式,最左邊是符號位,0為正,1為負
利用原碼對正數(shù)進行計算是不會有問題的。
十進制是逢十進一,不會出現(xiàn)10這個數(shù)字。
二進制是逢二進一,不會出現(xiàn)2這個數(shù)字。
原碼的示例
比如十進制56轉成二進制就是00111000。
00111000中,最左邊的0就是代表這個數(shù)為正數(shù),其余的0111000代表56,也就是下面這個樣子。
其中,一個0或者一個1就代碼1bit(中文翻譯叫比特位)。
計算機里是通常是把8個bit分為一組,叫做一個byte(字節(jié)),而字節(jié)是計算機中最小的存儲單元。
而一個字節(jié)最大值表示為01111111,轉化成十進制就是+127,是正的127。
最左邊的符號位取0,其余位為數(shù)據,因為是求最大,每位上全部取最大為1。
而一個字節(jié)最小值表示為11111111,轉化成十進制就是-127,是負的127。
最左邊的符號位取1,其余位為數(shù)據,因為是求最小,每位上全部取最小也為1 。
原碼的弊端
又舉個例子
現(xiàn)在有一個字節(jié)代表的數(shù)是-0,也就是0,如下圖
如果我現(xiàn)在要對它進行+1操作,也就是下面這樣
按理說0+1=(+1),但是根據上圖,這樣做的話就粗問題了,按照二進制的規(guī)則,這樣操作的二進制轉成十進制為-1,也就是下圖才是我們想要的結果
如果在此實際值上再進行+1操作,又出現(xiàn)了下面的情況
為什么會出現(xiàn)這樣的情況呢?
想要理解清楚,需要結合數(shù)軸去理解
如果我要用二進制表示0的基礎上+1,但是因為符號位是1代表負數(shù),實際是在0的位置上往負的方向前進的1單位,如下圖所示
所以這就是原碼的弊端:在原碼的基礎上,如果是負數(shù)計算,結果就出錯,實際運算的結果,跟我們預期的結果是相反的。
如果我們結合上面的數(shù)軸,在進行負數(shù)計算的時候,如果把數(shù)軸的方向倒轉一下,那不就得到了我們想要的結果了嗎?因此,這就引出了反碼的由來
反碼
反碼:為了解決原碼不能計算負數(shù)的問題而出現(xiàn)的
計算規(guī)則:
- 正數(shù)的反碼不變。
- 負數(shù)的反碼在原碼的基礎上,符號位不變。數(shù)值取反,0變1,1變0。
為什么正數(shù)的反碼不變?
- 因為正數(shù)之間的計算是沒有任何問題,只有我們上面舉到的例子中有負數(shù)的計算才會有反碼的出現(xiàn)
反碼的示例
又又舉個栗子
十進制-56的二進制原碼是10111000。根據規(guī)則,符號位不變。數(shù)值取反,0變1,1變0。它的反碼為11000111
驗證反碼能不能解決原碼負數(shù)計算的問題,我們可以驗證一下
就看看-56+1的值是不是為-55的這個情況?
- -56的原碼是10111000,而-56的反碼就是11000111。
- 進行-56+1的操作就是在-56的反碼11000111從最右邊的數(shù)字進1位根據二進制逢二進一變?yōu)?1001000
- 而55的原碼是0011011,所以-55的原碼就是1011011,所以-55的反碼就是1100100,結果成立!
這么一來,你就懂了吧?如果還沒明白,把上面的步驟多看幾遍,你就懂了
反碼的弊端
又又又舉個例子,我現(xiàn)在
現(xiàn)在又一個十進制數(shù)字-2,其原碼是1000 0010,其反碼為1111 1101
- 如果對-2進行+1操作之后,其原碼變?yōu)?000 0001,反碼變?yōu)?111 1110,結果為-2+1=-1,沒問題
- 如果對-2進行+2操作,也就是兩次+1操作,原碼會變成1000 0000 ,反碼變?yōu)?111 1111,結果為-2+2=0 也沒問題
- 如果對-2進行+3進行操作,也就是三次+1錯做,原碼會變成0000 0000,反碼變成0000 0000,結果為-2+3=0,到這里就不對起來了?
為什么會出現(xiàn)這樣的情況呢?
就是因為二進制對于0的表達有兩種方式,如下圖表格所示
十進制數(shù) |
原碼 |
反碼 |
+0 |
0000 0000 |
0000 0000 |
-0 |
1000 0000 |
1111 1111 |
-1 |
1000 0001 |
1111 1110 |
-2 |
1000 0010 |
1111 1101 |
怎么解決呢?這就引出了補碼的由來
當初的哪些計算機大佬是那么想的:既然反碼計算到0的時候會因為有2個0的表達方式而造成計算誤差,那我把反碼中的兩個0的表達方式屏蔽一個不就好了嘛。所以就有了補碼的出現(xiàn)
十進制數(shù) |
原碼 |
反碼 |
補碼 |
+0 |
0000 0000 |
0000 0000 |
0000 0000 |
-0 |
1000 0000 |
1111 1111 |
0000 0000 |
-1 |
1000 0001 |
1111 1110 |
1111 1111 |
-2 |
1000 0010 |
1111 1101 |
1111 1110 |
這樣就可以把0的兩種表現(xiàn)形式給屏蔽掉了,但是這里的補碼是為了有負數(shù)、有反碼的計算。
如果全部是正數(shù)的計算就用原碼計算即可
補碼
補碼:為了解決反碼不能計算負數(shù)超過0的問題而出現(xiàn)的
補碼的示例
先把上面的表拿下來
十進制數(shù) |
原碼 |
反碼 |
補碼 |
+0 |
0000 0000 |
0000 0000 |
0000 0000 |
-0 |
1000 0000 |
1111 1111 |
0000 0000 |
-1 |
1000 0001 |
1111 1110 |
1111 1111 |
-2 |
1000 0010 |
1111 1101 |
1111 1110 |
-3 |
1000 0011 |
1111 1100 |
1111 1101 |
-4 |
1000 0100 |
1111 1011 |
1111 1100 |
舉例一個跨0的情況,進行-4+5的操作
- -4的補碼是1111 1100
- 5是一個正數(shù)。正數(shù)的原碼、反碼、補碼的值都是一樣的,所以補碼為0000 0101
- 把兩者補碼進行相加操作,得到補碼0000 0001,表示十進制的數(shù)就是1,成功!
這么一來,你就懂了吧?如果還沒明白,把上面的步驟多看幾遍,你就懂了
補碼的小細節(jié)
因為補碼是在反碼的基礎上+1得到的,所以-127的補碼就是1000 0001,所以就會空出一位,因為+0和-0的補碼是相同的,就會節(jié)省出一個補碼跑到最下面,如下圖所示
十進制數(shù) |
原碼 |
反碼 |
補碼 |
+0 |
0000 0000 |
0000 0000 |
0000 0000 |
-0 |
1000 0000 |
1111 1111 |
0000 0000 |
-1 |
1000 0001 |
1111 1110 |
1111 1111 |
-2 |
1000 0010 |
1111 1101 |
1111 1110 |
-3 |
1000 0011 |
1111 1100 |
1111 1101 |
-4 |
1000 0100 |
1111 1011 |
1111 1100 |
...... |
...... |
...... |
...... |
-126 |
1111 1110 |
1000 0001 |
1000 0010 |
-127 |
1111 1111 |
1000 0000 |
1000 0001 |
-128 |
無 |
無 |
1000 0000 |
因為補碼的這個特性,-128是特殊規(guī)定的,因此沒有原碼和反碼。但是這也不影響,因為計算機中數(shù)字的存儲和運算都是以補碼為基礎進行的
總結
原碼是用來表示十進制數(shù)據的一種二進制形式,最左邊的一位是符號位,0表示正數(shù),1表示負數(shù)。但是,原碼不能直接用于負數(shù)計算,如果用原碼進行負數(shù)計算,結果會出錯,實際運算的方向與正確運算的方向相反。
反碼是為了解決原碼不能計算負數(shù)的問題而出現(xiàn)的。對于正數(shù),反碼和原碼一樣;對于負數(shù),反碼是在原碼的基礎上將符號位不變,數(shù)值位全部取反(即0變1,1變0)。然而,反碼也存在一個問題,那就是如果負數(shù)的計算結果跨過0,那么結果會比實際結果多1。文章來源:http://www.zghlxwxcb.cn/news/detail-718175.html
補碼則是為了解決反碼不能計算負數(shù)超過0的問題而出現(xiàn)的。對于正數(shù),補碼和原碼、反碼一樣;對于負數(shù),補碼是在反碼的基礎上加1。這樣,負數(shù)就可以正確地用補碼表示了。此外,補碼還可以多記錄一個特殊的值-128,這在用一個字節(jié)表示數(shù)據的情況下是特別重要的。文章來源地址http://www.zghlxwxcb.cn/news/detail-718175.html
到了這里,關于List 3.5 詳解原碼、反碼、補碼的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!