在計算機內(nèi)部數(shù)值是以補碼的方式進(jìn)行存儲的,采用補碼進(jìn)行數(shù)據(jù)存儲當(dāng)然有其優(yōu)點,下面會一一介紹相關(guān)內(nèi)容,讓各位徹底弄懂原碼、反碼、補碼的概念以及為什么采用補碼作為數(shù)據(jù)存儲的方式。
注意:下面列舉的例子均是指8位的字節(jié)數(shù)據(jù)。對于16位,32位的數(shù)據(jù)同樣適用,只是為了書寫方便,8位是最好的選擇啦!
1、無符號數(shù)與有符號數(shù)
在介紹原碼、反碼和補碼的概念之前,先來了解下無符號數(shù)和有符號數(shù)。
在計算機系統(tǒng)中,我們可以將數(shù)分為兩類:無符號數(shù)和有符號數(shù)。無符號數(shù)的意思是我們不關(guān)心這些數(shù)的符號,因此也就無所謂正負(fù),反正它們就是數(shù)而已,就像小學(xué)生一樣,眼中只有自然數(shù)。在8位的字節(jié)運算中,無符號數(shù)的范圍是0000_0000B~1111_1111B,即十進(jìn)制的0~255。
有符號數(shù)是分正負(fù)的,而且規(guī)定,數(shù)的正負(fù)要通過它的最高位來辨別。如果最高位是0,它就是正數(shù);如果是1,就是負(fù)數(shù)。這樣一來,在8位的字節(jié)運算環(huán)境中,正數(shù)的范圍是0000_0000B~0111_1111B,即十進(jìn)制的0~127;負(fù)數(shù)的范圍是1000_0000B~1111_1111B,即10進(jìn)制的-128~-1。也就是說8位的數(shù)據(jù),有符號數(shù)的范圍是-128~127(對這里的負(fù)數(shù)有疑問的可以往下面看)。
2、原碼、反碼與補碼
原碼:最高位表示符號位,其余位代表數(shù)值大小。如果最高位是0,它就是正數(shù);如果最高位是1,就是負(fù)數(shù)。例如:十進(jìn)制數(shù)+2,其二進(jìn)制形式為:0000_0010B;如果是-2,就是1000_0010B。因為最高位是符號位,所以原碼二進(jìn)制的形式值不等于真正的數(shù)值。例如上面的有符號數(shù)1000_0010B,其最高位1代表負(fù)數(shù),表示的數(shù)值為-2,而不是形式值130(1000_0010B轉(zhuǎn)換成無符號十進(jìn)制等于130)。
反碼:正數(shù)的反碼是其本身;負(fù)數(shù)的反碼是在原碼的基礎(chǔ)上,符號位不變,其余各數(shù)值位取反。
補碼:正數(shù)的補碼是其本身;負(fù)數(shù)的補碼是在其原碼的基礎(chǔ)上,符號位不變,其余各數(shù)值位取反,最后+1(即負(fù)數(shù)的補碼是其反碼+1)。
下面列舉幾個8位二進(jìn)制數(shù)的原碼、反碼和補碼的編碼形式:
十進(jìn)制數(shù) | 原碼 | 反碼 | 補碼 |
42 | 0010 1010 | 0010 1010 | 0010 1010 |
-42 | 1010 1010 | 1101 0101 | 1101 0110 |
127 | 0111 1111 | 0111 1111 | 0111 1111 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
3、補碼存儲數(shù)據(jù)的優(yōu)點
在講述原碼、反碼和補碼時,有一個特殊的數(shù)值沒有涉及到,那就是0,在我們平時使用中,0是沒有正負(fù)之分的,但是不可否認(rèn)+0 = -0,那么下面列舉下+0,-0的原碼、反碼與補碼的形式:
十進(jìn)制數(shù) | 原碼 | 反碼 | 補碼 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
為什么-0的反碼1111_1111B進(jìn)行加1操作求取到的-0補碼是0000_0000B。因為這里假定數(shù)據(jù)寬度是8位的,1111_1111B加1之后,會逐個向上進(jìn)位,我們假定有第9位,且值為0,那么0_1111_1111B加1之后,就變成了1_0000_0000B,但是實際上我們要的數(shù)據(jù)是8位的寬度,這里舍棄第9位,最后結(jié)果就變成了0000_0000B。
好了,在講述補碼的優(yōu)點之前,先看看計算機為什么不使用原碼作為數(shù)的存儲格式而采用補碼作為數(shù)的存儲格式。
下面說說原碼的優(yōu)缺點吧。
原碼的優(yōu)點當(dāng)然是簡單直觀,例如+2的原碼為:0000_0010B,-2的原碼為:1000_0010B。
原碼的缺點也顯而易見:
(1)、+0與-0在原碼中竟然有兩個二進(jìn)制形式,與我們熟知的+0=-0貌似有出入。
(2)、原碼不能直接參加運算,可能會出錯。例如:1+(-1)=0,而用原碼的二進(jìn)制形式進(jìn)行運算為:0000_0001B + 1000_0001B = 1000_0010B,換算成十進(jìn)制為-2,顯然計算結(jié)果錯誤。
那么計算機為什么要使用補碼呢?
首先,根據(jù)運算法則減去一個正數(shù)等于加上一個負(fù)數(shù),即: 1-1 = 1+(-1),所以計算機被設(shè)計成只有加法而沒有減法,而讓計算機辨別”符號位”會讓計算機的基礎(chǔ)電路設(shè)計變得十分復(fù)雜,于是就讓符號位也參與運算,從而產(chǎn)生了反碼。
用反碼計算,出現(xiàn)了”0”這個特殊的數(shù)值,0帶符號是沒有任何意義的。而且會有0000_0000B和1000_0000B兩個原碼編碼表示0。于是設(shè)計了補碼,負(fù)數(shù)的補碼就是反碼+1,正數(shù)的補碼就是正數(shù)本身,從而解決了0的符號以及兩個編碼的問題:用0000_0000B表示0,用1000_0000B表示-128。
注意:-128并沒有原碼和反碼。使用補碼,不僅僅修復(fù)了0的符號以及存在兩個編碼的問題,而且還能夠多表示一個最低數(shù)值。
如果還不清楚-128怎么來的,那么我就來按我的想法來推出來吧,-127的原碼為:1111_1111B,則其反碼為:1000_0000B,補碼為:1000_0001B,那么自然我們可以想想補碼為1000_0000B代表的就是-128=-127-1=1000_0001B - 1= 1000_0000B。這也就是8位數(shù)據(jù)最小的負(fù)整數(shù)了。
這就是為什么8位二進(jìn)制,使用補碼表示的范圍為[-128,127]。
補碼存儲數(shù)據(jù)的優(yōu)點:
(1)、避免了0的編碼有兩個;
(2)、符號位和有效值位可以一起處理,減法通過加法就可以實現(xiàn),即簡化了計算機的結(jié)構(gòu)設(shè)計也提高了運算速度。
補碼存儲數(shù)據(jù)的缺點:
(1)、不夠簡單直觀。當(dāng)然這里的不夠簡單直觀是對我們來說的。計算機倒沒什么。
下面給大家推薦一個計算補碼的小工具,那就是我們經(jīng)常使用的Windows計算器,只要選擇好相應(yīng)的數(shù)據(jù)寬度,輸入你的數(shù)值,就可以觀察到對應(yīng)的二進(jìn)制形式了:
2018-12-25_191046
好了,講了這么多,相信大家對原碼、反碼和補碼都有一定的認(rèn)識了。
審核編輯:湯梓紅
-
計算機
+關(guān)注
關(guān)注
19文章
7550瀏覽量
88753 -
原碼
+關(guān)注
關(guān)注
0文章
3瀏覽量
7167 -
補碼
+關(guān)注
關(guān)注
0文章
14瀏覽量
7573 -
符號
+關(guān)注
關(guān)注
0文章
55瀏覽量
4392
原文標(biāo)題:計算機基礎(chǔ)-原碼 反碼 補碼 基礎(chǔ)解析
文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
原碼反碼補碼的詳細(xì)理解
補碼是什么 補碼和原碼的轉(zhuǎn)化
計算機的原碼與反碼及其補碼是干啥的?
計算機為什么使用補碼的形式來表示負(fù)數(shù)
深入探求反碼和補碼
計算機為什么要使用補碼
單片機(STC系列8051內(nèi)核單片機)
![單片機(STC系列8051內(nèi)核單片機)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論