為什麼要用補碼?

2022-09-14 06:00:13 字數 1266 閱讀 6922

我們都知道計算機中的負數是用補碼來表示的,而負數的補碼是原碼符號位不變,其他位按位取反再加一。但是為什麼必須這樣?為什麼非要取反再+1?這個定義是怎麼來的?

首先我們用我們熟悉的十進位制來思考問題,假設現在我們只考慮兩位數字的運算,比如56 + (-28) = 56 - 28,這裡如果作正常的減法運算,就需要借位,也就是先讓"6"減去"8"的時候,發現不夠減,所以要向高位「借一位」,所以"5"只能借一位給「6」,然後「5」變成「4」,這樣的「借位規則」如果用電路來實現,會很複雜(至於如何用電路實現,感興趣的同學可以去看《code》的一到十二章),但幸運的是我們有辦法來避免這樣的借位:

56 + (-28) = 56 - 28 + 99 - 99       //加99再減99表示式值不變

= 56 - 28 + 99 + 1 - 100 //把-99寫成1 - 100

= (99 - 28 + 1) + 56 - 100 //交換一下位置

如上面最後一步所示,如果按照其從左到右的順序依次運算,是完全不需要借位的,這裡的99其實可以看成「兩位數字能表示的最大的數值「,如果是三位數字,那就是999。最後在減去100之前,其實已經」溢位「了,這時候只要把最高位捨去就行了。

換到二進位制也是乙個道理,假設我們只能用八位數字來表示乙個數值,那麼上面的28寫成二進位制就是00011100,然後我們要用「八位數字能表示的最大的數值」減去它,就是11111111 - 00011100,這時候你會發現,這樣做的結果剛好就是00011100全部都取反一下(0變1,1變0),變成11100011,然後再加一變成11100100,這時候再加上56(也就是二進位制的00111000):

11100100

+ 00111000

------------

100011100

然後把結果中多出來的一位最高位捨去,就得到了00011100,也就是十進位制的28(56 - 28 = 28)!

寫到這裡我想大家應該已經明白了,只要把-28(二進位制的-00011100)用72(二進位制的11100100)來表示,就能直接用加法得到正確結果了。這也是為什麼負數的符號位是1的原因,因為,比如用八位二進位制來表示乙個數值,如果要包含負數的話,那我們只能捨棄一半原來的正數,讓這部分正數來表示負數,很自然地我們用「更大的那一半」來表示負數,比如原來可以表示0到256,現在我們就把128到256「分給負數」,剩下的0到127繼續表示正數(如果用128到256來表示正數,0到127表示負數,那麼0到127和-127到0這部分數值就沒人表示了)。所以,「一串01」在計算機中到底表示幾,還得看它能不能表示負數。

為什麼要用補碼

在探求為何機器要使用補碼之前,讓我們先了解原碼,反碼和補碼的概念.對於乙個數,計算機要使用一定的編碼方式進行儲存.原碼,反碼,補碼是機器儲存乙個具體數字的編碼方式.原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 1 原 0000 0001 1 原 1000 ...

為什麼要用補碼表示

用補碼的主要原因 使用補碼,可以將符號位和其它位統一處理 同時,減法也可按加法來處理。另外,兩個用補碼表示的數相加時,如果最高位 符號位 有進製,則進製被捨棄。n位計算機,設n 8,所能表示的最大數是11111111,若再加1稱為100000000 9位 但因只有8位,最高位1自然丟失。又回了000...

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

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