1 什么是補碼
計算機底層均是通過二進制表示數(shù)據(jù),原碼、反碼、補碼是計算機中對數(shù)字的二進制表示方法。計算機以二進制補碼的形式存儲整數(shù),最高位是符號位,0 表示正數(shù),1 表示負數(shù),其余位為數(shù)字位。
-
原碼:將最高位作為符號位(0 表示正,1 表示負),其它數(shù)字位代表數(shù)值本身的絕對值的數(shù)字表示方式。
-
反碼:如果是正數(shù),則表示方法和原碼一樣;如果是負數(shù),將其絕對值的原碼各位取反,則得到這個數(shù)字的反碼表示形式。
-
補碼:如果是正數(shù),則表示方法和原碼一樣;如果是負數(shù),則將其反碼加上 1(相當于將原碼數(shù)值位取反,然后在最低位加 1)。
-
正數(shù)的原碼、反碼、補碼完全一樣,只有負數(shù)需要按照以上規(guī)則計算。
-
0 的反碼、補碼都為 0。
在計算機內(nèi)部使用固定數(shù)量的位來表示整數(shù):比如 32 或 64 ,簡單起見,我只考慮 8 位。以 8-bit 二進制數(shù)表示十進制整數(shù)。它的可表示范圍包括 - 128 到 127,即總共可以表示 256(2^8)個整數(shù)。
如計算 -3 的二進制補碼,先計算 3 的原碼 0000 0011,取反得到 1111 1100,再加 1 為 1111 1101。
數(shù)字 |
3 |
-3 |
---|---|---|
原碼 |
0000 0011 |
1000 0011 |
反碼 |
0000 0011 |
1111 1100 |
補碼 |
0000 0011 |
1111 1101 |
2 為什么使用補碼
-
計算機為什么要用補碼表示負數(shù),而不是只改變正數(shù)的符號位,使用原碼表示負數(shù)進行計算呢? 用原碼表示負數(shù),看起來很簡單易懂,但是進行加減等計算時,就會很麻煩。 +3 原碼為 0000 0011,-3 原碼為 1000 0011,這兩個數(shù)相加,直觀上應該等于 0,但是相加結(jié)果為 0000 0011 + 1000 0011 = 1000 0110,2000 0110 不管怎么解釋都不會為 0。
-
使用原碼計算時,那么 0 就有兩種表示形式:正 0(0000 0000)和負 0(1000 0000),這顯然也是我們不愿看到的。
如果計算機內(nèi)部采用原碼來表示數(shù),那么在進行加法和減法運算的時候,需要轉(zhuǎn)化為兩個絕對值的加法和減法運算。計算機既要實現(xiàn)加法器,又要實現(xiàn)減法器,代價有點大,那么可不可以只用一種類型的運算器來實現(xiàn)加和減的遠算呢?
補碼的出現(xiàn),就是為了解決這個問題的,使得計算機通過使用加法器就可以得到實現(xiàn)符合直覺的結(jié)果。
采用補碼形式計算 +3-3 =,+3 補碼為 0000 0011,-3 補碼為 1111 1101,計算過程為 0000 0011 + 1111 1011 = 0000 0000,符合我們的直覺。
3 補碼的實現(xiàn)原理
?
將時針從12點順時針撥2個小時,和順時針撥14個小時,和逆時針撥10個小時都是指向2,因為時鐘一圈是12個小時。
12 + 2 = 14; 12 + 14 = 26; 12 - 10 = 2
也就是說14、26、2在表盤上是相同的表現(xiàn)形式,將它們除以 12,得到相同的余數(shù) 2;12小時代表時鐘旋轉(zhuǎn)一周,在計算機里類似的概念叫模,它可以實現(xiàn)化減為加,本質(zhì)上是將溢出的部分舍去而不改變結(jié)果。
3.1 無符號二進制數(shù)
在計算機中使用 8 位無符號二進制數(shù),可以表示 0 ~ 255 之間的任意數(shù)字,一共 256 位數(shù)字,表示范圍的模為 256。在進行計算時,計算機只會讀取低 8 位的數(shù)據(jù),就會出現(xiàn)如下情況:1 與 257 的在此計算機看來是表現(xiàn)一樣的,因為任何大于 255 的數(shù)都不能用 8 位二進制表示,溢出的部分會被舍去。
?
8 位二進制可以表示 256 個數(shù),把它們圍成一個圈,如下圖所示:
?
可以看到 0000 0001 與 1 0000 0001 重疊在相同位置。
3.2 有符號二進制數(shù)
在計算機中使用 8 位有符號二進制數(shù),有符號數(shù)的表示范圍是-128~127。
如前所述,如果使用原碼表示整數(shù),那么進行加減運算時,有符號二進制數(shù)之間的運算需要制定與無符號二進制數(shù)不同的規(guī)則,否則得到的結(jié)果不符合直覺;但是用補碼表示整數(shù),有符號二進制數(shù)之間的運算有符號二進制數(shù)之間的運算則可以實現(xiàn)與無符號二進制數(shù)相同的計算規(guī)則。
?
從 0 開始,往前走 n 步,和往后走 256-n 步,到達的是相同的位置。
無符號數(shù)和有符號數(shù)的模都是 256,1111 1111 表示無符號數(shù)的 255,也可以表示有符號數(shù)的 -1。
有了同余這個機制,無論是無符號數(shù)還是有符號數(shù),計算機都可以使用相同的規(guī)則進行計算,同樣的二進制輸入,肯定會得到同樣的計算結(jié)果,把計算結(jié)果看作是無符號還是有符號,計算機是不管的,是由我們說了算。而且這種表示方法也解決了 0 有兩種表現(xiàn)形式這個問題,0000 0000 表示 0,1000 0000 則為 -128。
比如對于二級制算式 1000 0000 + 0000 0111 = 1000 0111,我們可以看做是無符號數(shù)計算 128 + 7 = 135,也可以看做有符號數(shù)計算 (-128) + 7 = (-121)。
同樣的,二進制算式 0001 0000+1111 1101 = 1 0000 1101,可以看做是無符號數(shù)計算 16 + 253 = 13,也可以看做有符號數(shù)計算 16 +( -3) = 13。
補碼的本質(zhì):找到一個替代負數(shù)(-3)的正數(shù)(253),并用此正數(shù)的二進制形式參與運算,進行加法運算后,將得到的結(jié)果中溢出的數(shù)字舍去后,只讀取結(jié)果中固定位數(shù)(此處是 8 位)的二進制數(shù)作為運算的結(jié)果。
4 補碼的計算方法
-
正數(shù)的補碼與原碼相等。將最高位作為符號位,其余各位,其它數(shù)字位代表數(shù)值本身的絕對值。
-
負數(shù)的補碼有兩種計算方式
-
先求出該負數(shù)絕對值的原碼,再全部取反得到該負數(shù)的反碼,最后加1即得補碼。
-
負數(shù)N + 模M = sum,sum對應的無符號二進制數(shù)既是該負數(shù)的補碼。
第一種是根據(jù)補碼的定義計算,前面已經(jīng)詳細介紹。
第二種是引入模之后獲得的計算補碼的新方式:比如計算 -3 的二進制數(shù),256 + (-3) = 253,253 的無符號二進制形式為 1111 1101,因此 -3 的補碼就是 1111 1101。文章來源:http://www.zghlxwxcb.cn/news/detail-434268.html
添加文章封面算機運算是如此方便與優(yōu)雅,所以現(xiàn)代計算機系統(tǒng)統(tǒng)一采用這種數(shù)字表示方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-434268.html
到了這里,關于補碼究竟是什么?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!