計算機底層為什麼要用補碼,而不用原碼或反碼?

2022-06-20 18:30:10 字數 2704 閱讀 6608

計算機底層為什麼要用補碼,而不用原碼或反碼?

位元與位元組

計算機是依二進位制的方式進行儲存的,最小的儲存單元是「位元(bit)「,或者稱作「位「,這是二進位制的概念,相對於10進製的就是個十百千萬這樣的位。

但計算機在儲存的時候是按8個位元位「為乙個「位元組(byte)「進行儲存的,即1byte = 8bit。

1個位元可以表示兩種資訊,8個位元就可以表示可以儲存28種資訊,即256種不同的資訊。所以用乙個位元組來表示整數的話就是0-255,。這個區間數字的應用也非常的多,舉乙個最常見的例子:rgb顏色的值,就是0-255。還有乙個例子就是mysql資料庫的tinyint 型的字段如果不設定unsigned型別,只能儲存-128到127的整數。也就是256種不同的結果,同時乙個tinyint型資料只占用乙個位元組。這也就是為什麼mysql初學者疑惑的資料占用的位元組跟自己想得不一樣問題。

二進位制的8個長度誤區,2進製為什麼用8位表示?

網友的解釋是:

計算機中只要乙個位元組就可以存放ascii編碼,就是所有的數字、大小寫字母和一些特殊字元(總共剛好255個)。所以在計算機中對使用者來說有意義的單位就是位元組。

個人的想法是:

8個長度的2進製資料,最多表示256種情況,很有侷限性,257種情況下,8位就完不成了,何況世界那麼大,256太小了。所以二進位制跟用8位表示沒有直接關係,簡單的8位它也表示不完

8個長度僅僅表示257以內或-128到127資料的習慣表示方法。但湊夠8個固定長度為乙個位元組,到是保持了小資料的占用空間的一致性,放到乙個位元組裡就是8位。這東西了解就行,不用深究,公司上班不會問你這些。

原碼:0的二進位制是0,1的二進位制是1,2的二進位制是10,3的二進位制是11。

習慣8位長度的表現形式。所以寫法就是:0也可以表示成00000000,以此類推,11可以表示成00000011。長度不夠,用零來湊

需要注意的是:整數的正負屬性使用位元組的最高位來區分,也就是從左數第乙個數字來表示正負,0為正,1為負

舉個栗子:

10進製的3,二進位制就是00000011;

10進製的-3,二進位制就是10000011;

例子的核心的資料就是開頭的0或1,和結尾的11,。中間用0填充使其一共湊夠8個長度。就是說分兩塊:左邊最高位代表正負,結尾非0開始有用的是絕對值,中間不夠用0填充

這種寫法叫做原碼。

反碼:反碼的意思就是除符號位(可以理解成左邊第乙個字元)不變外,其餘按位取反,這種方式對負數生效。對於正數,正數的反碼可以理解為和原碼相同,也就是不進行除符號位外的取反操作。

舉個例子:

已經知道1的原碼可以寫成00000001,反碼就是00000001

同樣的-2的原碼是10000010,反碼就是11111101

補碼:正數的補碼可以理解為和原碼相同,負數的補碼可以理解成,反碼+1

舉個例子:

已經知道1的原碼可以寫成00000001,補碼就是00000001

同樣的-2的原碼是10000010,補碼就是11111101 + 1 = 11111110

小結:正數的反碼和補碼與原碼是沒有區別的。所以反碼和補碼是針對負數的。

回答之前需要了解

計算機是不能直接做減法運算的,因為普通電腦硬體中沒有減法器,不需要額外的增加硬體電路製造難度,減法器無需存在。但可以優雅的轉換成減法

如何計算?【10 - 7】可以轉換成【10 + (-7)】,就這麼簡單。計算機的腦袋沒有減法概念,不代表沒有負數的概念。

計算【1 - 1 = 0】,若用原碼計算:

轉成原碼後進行計算:

00000001 + 10000001 = 10000010

10000010 是-2,計算錯誤。

則:原碼不能做計算。

計算【1 - 1 = 0】,若用反碼計算:

轉成反碼後進行計算:

00000001 + 11111110 = 11111111

此時的8個1是反碼,轉成原碼,就是10000000,也就是-0

-0和0也算正確。

但是又會出來乙個問題:

0就有兩種表示方法:10000000或00000000

由於計算機是嚴謹的學術,並且學術也是嚴謹的,在現實生活中-0和0區別不大,但是在計算機中被認為是不合理的。

則:反碼不適合做計算。

計算【1 - 1 = 0】,若用補碼計算:

轉成部碼後進行計算:

00000001 + 11111111 = 00000000

8個0是0,計算正確,也解決了反碼帶來的問題。

則:用補碼計算最好。

為什麼00000001 + 11111111 = 00000000?

此時可要想好:

00000001 是1,沒毛病。

11111111可不是255,它是-1的補碼。

所以結果不會是100000000,也就不是256,這是補碼的規則,不是逢二進一的規則。

補碼滿足以下計算規則:

⑴如果補碼的符號位為「0」,表示是乙個正數,其原碼就是補碼。

⑵如果補碼的符號位為「1」,表示是乙個負數,那麼求給定的這個補碼的補碼就是要求的原碼。

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

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

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

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

為什麼計算機用補碼運算

使用補碼,可以將符號位和數值域統一處理,從而簡化運算規則 簡化運算器的結構,提高運算速度 使減法運算轉換為加法運算,進一步簡化計算機中運算器的電路設計 兩個用補碼表示的數相加時,如果最高位 符號位 有進製,則進製被捨棄,而這樣計算仍然正確 採用補碼表示還有另外乙個原因,那就是為了防止0機器數有兩個編...