計算機底層均是以二進制表示的,數(shù)字也不例外,本文旨在探討一下數(shù)字的原碼、反碼和補碼。
概念
需要聲明的是,本文涉及到的數(shù)字及運算均基于8位bit下的值。
原碼
最高位為符號位,0代表正數(shù),1代表負數(shù),非符號位為該數(shù)字絕對值的二進制表示。
如:
127的原碼為0111 1111
-127的原碼為1111 1111
反碼
正數(shù)的反碼與原碼一致;
負數(shù)的反碼是對原碼按位取反,只是最高位(符號位)不變。
如:
127的反碼為0111 1111
-127的反碼為1000 0000
補碼
正數(shù)的補碼與原碼一致;
負數(shù)的補碼是該數(shù)的反碼加1。
如:
127的補碼為0111 1111
-127的補碼為1000 0001
總結(jié)一下就是:
正數(shù)的原碼、反碼、補碼是一致的;
負數(shù)的補碼是反碼加1,反碼是對原碼按位取反,只是最高位(符號位)不變;
計算機數(shù)字運算均是基于補碼的。
下面就來探討一下,為啥要用補碼來表示數(shù)字。
補碼有啥好?
如果計算機內(nèi)部采用原碼來表示數(shù),那么在進行加法和減法運算的時候,需要轉(zhuǎn)化為兩個絕對值的加法和減法運算;
計算機既要實現(xiàn)加法器,又要實現(xiàn)減法器,代價有點大,那么可不可以只用一種類型的運算器來實現(xiàn)加和減的遠算呢?
很容易想到的就是化減為加,舉一個生活中的例子來說明這個問題:
時鐘一圈是360度,當然也存在365度,但其實它和5度是一樣的;
相同的道理,-30度表示逆時針旋轉(zhuǎn)30度,其與順時針旋轉(zhuǎn)330度是一樣的;
這里數(shù)字360表示時鐘的一圈,在計算機里類似的概念叫模,它可以實現(xiàn)化減為加,本質(zhì)上是將溢出的部分舍去而不改變結(jié)果。
易得,單字節(jié)(8位)運算的模為256=2^8。
在沒有符號位的情況下,127+2=129,即:

這時,我們將最高位作為符號位,計算機數(shù)字均以補碼來表示,則1000 0001的原碼為減1后按位取反得1111 1111,也就是-127。
也就是說,計算機里的129即表示-127,相當于模256為一圈,順時針的129則和逆時針127即-127是一樣的。
故可以得到以下結(jié)論:
負數(shù)的補碼為模減去該數(shù)的絕對值。
如-5的補碼為:
-5=256-5=251=1111 1011(二進制)
同樣的,臨界值-128也可以表示出來:
-128=256-128=128=1000 0000(二進制)
但是正128就會溢出了,故單字節(jié)(8位)表示的數(shù)字范圍為-128--127。
最后,我們來看一下,補碼是如何通過模的溢出舍棄操作來完成化減為加的!
16-5=16+(-5)=11

1 0000 1011將溢出位舍去,得0000 1011(二進制)=11。
好的,本文分享就到這里,希望能夠幫助到大家。