為什麼計算機以補碼形式儲存
大家都直到,在計算機中主要是以補碼的形式儲存,那麼為什麼二進位制數在原碼、反碼、補碼中選擇以補碼的形式儲存呢?
一、為什麼不以原碼形式儲存?
首先,原碼是站在使用者角度的,是原始的二進位制!
求原碼:
1.使用者的數字分為正負數,需要有一位儲存符號
2.最高位為符號位:0為正,1為負
3.左邊是高位,右邊是低位
由原碼的計算方式可以發現原始碼儲存會引發2個問題:
- 0有兩個儲存方式
我們以char型(佔1位元組,8位)為例(下同):
+0: 0000 0000
-0: 1000 0000
不難發現+0和-0的原碼是不一樣的,而在計算過程中,+0和-0是沒有任何區別的。
2. 正數和負數相加,結果不正確(計算機只會加)
1 - 1 =1 + (-1)
1: 0000 0001
-1: 1000 0001
1000 0010 = -2
很顯然1-1=0,而用原碼進行計算得出的結果卻相差甚遠!
二、為什麼不以反碼形式儲存?
既然原碼不適合作為計算機的儲存方式,人們在解決這個問題的過程中又提出了反碼的概念
求反碼:
- 求原碼
- 符號為不變,其他位取反
注意:正數原碼、反碼一樣!
- 接下來我們檢驗一下1 - 1:
1: 0000 0001
- 1: 1111 1110
1111 1111 ->1000 000(轉換為原碼,因為原碼是站在使用者角度的) = -0
不難可能出反碼已經解決的正負數相加結果不正確的問題
- 然後我們再檢驗+0、-0
+0 0000 0000
-0 1111 1111
由此看出,反碼並沒有解決0有兩種形式的問題
反碼儲存會引發1個問題:
- 0有兩個儲存方式
三、補碼儲存
在反碼的基礎上,人們有提出了補碼的概念
求補碼:
- 補碼為其反碼+1
注意:正數的原碼、反碼、補碼都一樣!
接下來我們對補碼儲存進行驗證:
+0: 0000 0000
-0: 原碼: 1000 0000
反碼: 1111 1111
補碼:1 0000 0000(char佔1位元組八位,最高位丟棄)= 0000 0000
可以看出補碼解決了+0 -0不一樣的問題
+1: 0000 0001
-1: 1111 1111
1 0000 0000(最高位丟棄)=0000 0000 = 0
那麼補碼也解決了正負數相加結果不正確的問題!
總結:
補碼是在原碼的基礎上為了適應計算機運算一步一步完善而來,原碼和反碼儲存都有一定的弊端,因此計算機採用補碼儲存!