原碼,反碼和補碼的一些小問題

爲什麼補碼等於反碼加一?爲什麼補碼中有符號位,只能表示最大正數補碼+127,卻能表示最小正數-128呢?計算機中怎麼對待符號位的?

一、原碼

1.定義(百度):

原碼(true form)是一種計算機中對數字的二進制定點表示方法。原碼錶示法在數值前面增加了一位符號位(即最高位爲符號位):正數該位爲0,負數該位爲1(0有兩種表示:+0和-0),其餘位表示數值的大小。

2.數學定義:

在這裏插入圖片描述
其中,負數時,2^(n-1)相當於負號。其二進制爲:1000 0000(B)

理解: 爲了表達負數,引入原碼。如何表達負數?將n位二進制中最高位人爲記爲符號位。
故,8位二進制中,範圍爲 -127 ~ 127;
1111 1111(原)= -127;
0111 1111 (原)= +127;

3.原碼的優勢:簡單直觀。

可以直接知正負和轉化爲十進制數。

4.原碼的缺點:

1.有兩個0;
一個+0 即 0000 0000(原);
一個-0 即 1000 0000(原)。
2.無法實現減法(異號數相加)計算。
例如:-1 + 1 = 0
1000 0001 (原) + 0000 0001(原)= 1000 0010(原)= -2

5.注意點:計算機中不存在原碼。

可以說是人們爲了表達正負數,引入了原碼概念。

二、反碼

1.定義(百度):

反碼是數值存儲的一種,多應用於系統環境設置,如linux平臺的目錄和文件的默認權限的設置umask,就是使用反碼原理。
沒學到,不太懂。
不過反碼是相對於原碼存在的,且幫助得到補碼。
簡單定義: 反碼跟原碼是正數時,一樣;
負數時,反碼就是原碼符號位除外,其他位按位取反。
如:1001 0010(原)= - 18 的反碼是 1110 1101(反)= 109

按位取反也可以看成,絕對值最大數 - 原碼絕對值
即 (1)111 1111 - (1)001 0010 = (1)110 1101 (符號不變)

2.數學定義:

在這裏插入圖片描述

3.意義:

1.反碼通常是用來由原碼求補碼或者由補碼求原碼的過渡碼。
換個角度,似乎如果沒有反碼,不影響原碼和補碼互轉化啊。

2.爲了解決“正負相加等於0”的問題,在“原碼”的基礎上,人們發明了“反碼”
“反碼”表示方式是用來處理負數的,符號位置不變,其餘位置相反。
例如:-1 + 1 = 0
1000 0001 (原) + 0000 0001(原)= 1000 0010(原)= -2
1111 1110(反) + 0000 0001(反) = 1111 1111(反)= 1000 0000(原)= -0
這不就實現了減法?

再來一例:-14 + 12 = -2
1000 1110 (原) + 0000 1100(原)
1111 0001 (反)+ 0000 1100(反) = 1111 1101(反) = 1000 0010(原)= -2

真的?14 - 12 = 2
0000 1110 (原 ) + 1000 1100(原)
0000 1110(反)+ 1111 0011(反)= 0000 0001(反) = 0000 0001(原) = 1
其實在這時存在着一個溢除單位,第一位爲0,第二次爲1,所以結果反碼也許應該加上進位。這樣可以解決反碼運算問題。但是不夠適用,仍然有進位

4. 注意點:1.計算機中無反碼。

2.而且,補碼仍然存在着-0 = 1000 0000 (原)其反碼 1111 1111(反)

三、補碼

1.“模”概念(不準確)和補數

“模”是指一個計量系統的計數範圍,如過去計量糧食用的鬥、時鐘等。計算機也可以看成一個計量機器,因爲計算機的字長是定長的,即存儲和處理的位數是有限的,因此它也有一個計量範圍,即都存在一個“模”。
生活中處處有模的存在,例如鐘錶計時,假設現在時針指向數字8,如要把時針調到指向5,(順時針爲正)則可以:

1 將時針逆時針撥動3格。
2.將時針順時針撥動(8+12 - 3)格。
兩者的結果是一樣的。這裏稱12爲“模”,而稱+9是(-3)以12爲模的補數,
故有 8 -3= 8+ (12 -3) ,這裏可以看到將減法轉換成加法的過程,即“加上模減去絕對值的差”。
注意補數定義:
負數的補數:模減去該負數的絕對值,
正數的補數:是本身。0的補數是0

同理,還有度數的360等等。
所以在計算機中,原數叫原碼,那麼補數就叫補碼

2.補碼(百度):

在計算機系統中,數值一律用補碼來表示和存儲。 原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理

3.數學定義:

在這裏插入圖片描述

4.補碼真正的由來

想必大家都明白,對原碼按位取反(除符號位),然後加1的原則。
想過爲什麼加1嗎?
根據上述補數的介紹,8位進制(有一位做了符號位,本質只有 -127 ~ 127),
模是1 0000 0000
例:-10 的 1000 1010(原) 1111 0101(反) 1111 0110(補)
同時 模 - 原碼(絕對值) = 補碼
1 0000 0000(模) - 0000 1010 (原絕對值)= 1111 0110 (補)
具體步驟如下:

1 0000 0000(模) = (1111 1111  + 0000 0001) - 0000 1010(原絕對值)
=(1111 1111 - 0000 1010 ) +  0000 0001
= 1111 0101(反)+ 0000 0001  (反碼 + 1 )
= 1111 0110(補)  

那麼 模 - 原碼(絕對值) = 反碼 + 1 = 補碼

原碼是正數,補碼是本身,0的補碼是0 。
如此以來巧妙使符號不影響結果,又能實現區別正負。但這時反碼似乎沒什麼作用。只要找到模,理解模 - 原碼(絕對值) = 補碼,就可以較快速得到原碼和補碼的轉換,似乎可以丟了反碼。

注意: 如果用按位取反,加一原則,你是無法得到 -128 這個原碼的。
因爲 -128 補碼是 1000 0000,如果減一(0000 00001)= 0111 1111(反)
按位取反 0000 0000(原),這不是0嗎?

但是,這樣,原碼(1000 0000),模(1 0000 0000)- 原碼 = 1000 0000 (補碼)
原碼(1000 0000)是-0,這個歷史遺留。但是記住,計算機存儲中無原碼。準確來說是沒有符號位, 那麼這個原碼可以理解爲
-128是一個負數,所以它的補碼是它的“模”減去它的絕對值,即:
1 0000 0000 - 1000 0000 = 1000 0000(補)。

還有這種理解
在這裏插入圖片描述

5.注意點:1.計算機中僅有補碼錶示與存儲。

2。模的確定。計算機中由於多一個符號的理解。所以,
4 位二進制數的模是 2^4=16,
8 位二進制數的模是 2^8=256,
16 位二進制數的模是 2^16=65536,
32 位二進制數的模是 2^32。

四、計算機中對數的存儲於處理

1.一個標準:計算機僅有0,1存儲。

簡單來說就是無符號數字。

2.兩個指令:

如果是 unsigned char ,計算機的一個指令認爲最高位,不代表符號。
如果是char, 計算機的另一個指令認爲最高位是符號位,0爲正,1爲負。

3.數據存儲只有補碼,

因爲補碼和無符號數運算統一,
不存在原碼,反碼存儲。

優秀指導文章:原碼、反碼、補碼的產生、應用以及優缺點有哪些?

筆者水平有限,目前只能描述以上問題,如果有其他情況,可以留言,有錯誤,請指教,有繼續優化的,請分享,謝謝!

2020年02.12 家

發佈了11 篇原創文章 · 獲贊 3 · 訪問量 1909
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章