計算機為什麼採用補碼儲存數值

2021-07-29 17:18:47 字數 1127 閱讀 2452

初學c,問題源自:為什麼c中的int型別(16位)的下溢下限為-32768而上溢上限卻是32767。

首先說吧,32767很容易理解,32767=2^15-1 (因為要有乙個符號位),但為什麼下溢的時候分明是15位來表示的數會出現32768呢?

首先從原碼重點內容講起,原碼即為計算機中對數值的二進位制表示,如 5用二進位制表示為0000 0101 ;

其次就是反碼,反碼,顧名思義取反,對於正數來說,反碼與原碼相同;對於負數來說,反碼為原碼的各位取反(符號位除外),如(0011 0111)反= 0011 0111 (1101 0010)反= 1010 1101 ;

再次就是補碼,計算機中,數值疑慮用補碼表示和儲存的,正數的補碼與原碼相同,負數的補碼為其反碼+1,如(0101 1101)補=0101 1101 (1101 0010)補=1010 1110

由於計算中的cpu只有加法器,沒有減法器,所以在計算機採用原碼做減法是會存在這樣的問題:對於1-1=0

看做1+(-1)=0 二進位制表示 0001+1001=1001 變成了十進位制的負1而不是0。補碼的出現很好的解決了這個問題,由於採用補碼運算,則補碼加法成為:[x+y]補 = [x]補 + [y]補同時,補碼的減法變為:[x-y]補 = [x]補 - [y]補 = [x]補 + [-y]補 補碼的乘法變為:【x*y】補=【x】補×【y】補;在此我們以減法為例說明補碼的優勢,還以上述為題為例:(0001)補+(1001)補 = 0001 + 1111 = 0000 (最高位的進製省略),這樣就順利得到了0

另外,補碼還解決了原碼中存在兩個0 的問題(即+0 和 -0),以8進製為例,int_8的取值範圍應該是-127~ -0和+0~ 127 即存在正0 0000 0000 和 負 0 1000 0000 ,但是在兩個0轉換為補碼後全部都變成了0000 0000,細心的你會說原來8位編碼表示的256的二進位制數在補碼中不就少了乙個嗎?

對,當然是少了乙個,對於1000 0000 ,任何原碼都不能轉換成補碼後成為1000 0000的形式

但數是死的,人是活的,不能讓xx憋死不是? 所以人為規定補碼中 1000 0000 表示 -128 ,這就很好的解釋了,為什麼8位的整形變數的下溢下界會是-128而上溢上屆是127了。

同樣,對於16進製制int,也是這樣, 表示範圍成了 - 32768 ~ 32767 (32768=2^15)

計算機為什麼採用補碼的形式儲存資料?

在計算機內部,所有資訊都是用二進位制數串的形式表示的。整數通常都有正負之分,計算機中的整數分為無符號的和帶符號的。無符號的整數用來表示0和正整數,帶符號的證書可以表示所有的整數。由於計算機中符號和數字一樣,都必須用二進位制數串來表示,因此,正負號也必須用0 1來表示。通常我們用最高的有效位來表示數的...

計算機補碼,為什麼要用補碼

在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值一併處理,不需要單獨的處理符號位而降低複雜度,使得加法和減法也可以統一處理 為什麼要用補碼,好處是什麼?為了表示二進位制數,如果直接用原始碼形式,需要額外的硬體 缺點 區分符號位0,1 如果用反碼,無需硬體分辨符號位,...

計算機為什麼使用補碼來儲存資料

說明 以下討論,都是用8位來儲存的資料型別 char型別,為什麼?為什麼用補碼呢?我反覆思考著,後來在王爽的組合語言裡和網上找到了答案,有如下總結 原碼的數出現0,和 0的兩個碼!我們知道 0 0 所以0000 0000,1000 0000兩個碼會表示同乙個數!8位資料可以表示 127 127的25...