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

2021-08-04 04:02:17 字數 1780 閱讀 6379

說明:以下討論,都是用8位來儲存的資料型別:char型別, 

為什麼?為什麼用補碼呢?我反覆思考著,後來在王爽的組合語言裡和網上找到了答案,有如下總結:

原碼的數出現0,和-0的兩個碼!我們知道-0== 0;所以0000 0000,1000 0000兩個碼會表示同乙個數!

8位資料可以表示-127~127的254個有符號數。但是理論上8位資料是可以表示255中不同資訊的。

同樣反碼也只能表示-127~127的254個有符號數。0出現重碼。

補碼可以表示-128~127的255個有符號數;

不僅如此,補碼還有很多特性,這些特性為符號數的運算提供了方便。(而且有些特新「原碼」和「反碼」是不具備的)

補碼定義:正數的補碼與原碼相同;負數的補碼是對其原碼逐位取反,但符號位除外;然後整個數加1。

[x]補:表示x的補碼

|x|:表示x的絕對值

當x < 0 時[x]補 = 2~8 - |x|;

當x >=0 時[x]補 = |x| =x;

1)  [x+y]補 = [x]補 +[y]補

2)  [x-y]補 = [x]補 - [y]補 = [x]補 + [-y]補

3)  [x*y]補=[x]補*[y]補 (乘數(被乘數)相乘的補碼等於補碼的相乘。)

4)  正數的補碼取反加1後,為其對應的負數的補碼;負數的補碼取反加1後為其絕對值的補碼。

即:x>=0:[ [-x]補 ]補 = |x| = x

x<0 [ [x]補]補 = |x| = -x

等等……

(1)設:x>=0,y>=0;-àx+y>=0

所以[x+y]補=x+y;[x]補=x;[y]補=y;

所以[x+y]補 = [x]補 +[y]補

(2)設:x<0,y<0;àx+y<0 且|x|+|y| = |x+y|

[x+y]補 = 2^8-|x+y|;[x]補=2^8-|x|;[y]補=2^8-|y|;

[x]補+[y]補 = 2^8-(|x|+|y|)+2^8;

因為只有8位表示而且還有一位是符號位所以(|x|>=0&&|x|<2^7)&& (|y|>=0&&(|y|<2^7)à|x|+|y|<2^8)所以2^8-(|x|+|y|)>0

所以2^8-(|x|+|y|) +2^8將會溢位一位(因為只有8位儲存資料),所以2^8-(|x|+|y|)+2^8 =2^8-(|x|+|y|)  = 2^8-(|x+y|) = [x+y]補

(3)設x>=0,y<0

[x]補+[y]補 =|x| +2^8-|y| = 2^8 +(|x|-|y|)

3-1)再設|x|>|y|à(|x|-|y|>0且x+y>0)由於只有8位來儲存資料,會溢位一位,所以2^8+(|x|-|y|) = |x|-|y| = x+y(因為x>=0 ,y<0)

因為x+y>0所以[x+y]補 = x+y=[x]補+[y]補;

3-2)再設|x|<=|y|à(|x|-|y|<=0 且 x+y<=0)所以[x+y]補=2^8 - |x+y| = 2^8+x+y=2^8+|x|-|y|=[x]補+[y]補;

綜上可得出: [x+y]補 = [x]補 +[y]補

自己證明的,也許有錯誤,如果有錯,望指教!

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

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

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

初學c,問題源自 為什麼c中的int型別 16位 的下溢下限為 32768而上溢上限卻是32767。首先說吧,32767很容易理解,32767 2 15 1 因為要有乙個符號位 但為什麼下溢的時候分明是15位來表示的數會出現32768呢?首先從原碼重點內容講起,原碼即為計算機中對數值的二進位制表示,...

計算機基礎 計算機為什麼要使用補碼?

三 為什麼使用反碼?四 為什麼使用補碼?五 原碼 反碼 補碼優缺點 六 總結 n位補碼能表示的範圍 原碼中的符號位僅用來表示數的正 負,不參加運算,進行運算的只是數值部分。原碼運算時,應首先比較兩個數的符號,若兩數的符號相同,則可將兩個數的數值相加,最後給結果附上相應的符號 若兩數的符號不同,則需比...