計算機的原碼,反碼,補碼的理解

2021-08-09 06:34:01 字數 4633 閱讀 9544

在學習原碼, 反碼和補碼之前, 需要先了解機器數和真值的概念.

在探求為何機器要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念.對於乙個數, 計算機要使用一定的編碼方式進行儲存. 原碼, 反碼, 補碼是機器儲存乙個具體數字的編碼方式.

-原碼: 原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進位制:[+1]原 = 0000 0001[-1]原 = 1000 0001第一位是符號位. 因為第一位是符號位, 所以8位二進位制數的取值範圍就是:[1111 1111 , 0111 1111]即[-127 , 127]原碼是人腦最容易理解和計算的表示方式.

- 反碼:反碼的表示方法是:正數的反碼是其本身負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.[+1] = [00000001]原 = [00000001]反[-1] = [10000001]原 = [11111110]反可見如果乙個反碼表示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.

- 補碼:補碼的表示方法是:正數的補碼就是其本身負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)[+1] = [00000001]原 = [00000001]反 = [00000001]補[-1] = [10000001]原 = [11111110]反 = [11111111]補對於負數, 補碼表示方式也是人腦無法直**出其數值的. 通常也需要轉換成原碼在計算其數值.

現在我們知道了計算機可以有三種編碼方式表示乙個數. 對於正數因為三種編碼方式的結果都相同:[+1] = [00000001]原 = [00000001]反 = [00000001]補所以不需要過多解釋. 但是對於負數:[-1] = [10000001]原 = [11111110]反 = [11111111]補可見原碼, 反碼和補碼是完全不同的. 既然原碼才是被人腦直接識別並用於計算表示方式, 為何還會有反碼和補碼呢?

首先, 因為人腦可以知道第一位是符號位, 在計算的時候我們會根據符號位, 選擇對真值區域的加減. (真值的概念在本文最開頭). 但是對於計算機, 加減乘數已經是最基礎的運算, 要設計的盡量簡單. 計算機辨別」符號位」顯然會讓計算機的基礎電路設計變得十分複雜! 於是人們想出了將符號位也參與運算的方法. 我們知道, 根據運算法則減去乙個正數等於加上乙個負數, 即: 1-1 = 1 + (-1) = 0 ,所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了,並且實際乘法和除法也是可以通過加法和移位來實現

總而言之,原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用1表示負號,數值一般用二進位制形式表示。機器數的反碼可由原碼得到。如果機器數是正數,則該機器數的反碼與原碼一樣;如果機器數是負數,則該機器數的反碼是對它的原碼(符號位除外)各位取反而得到的。機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,並在未位加1而得到的。如果是為了考試,死記即可。但我總想搞清楚為什麼計算機裡面的數要這樣子表達?意義何在?-128的補碼為什麼是10000000?為什麼補碼有這麼奇怪的運算規則?計算機算減法的時候都需要從原始碼到補碼的計算嗎?

原碼是機器數的一種簡單表示法,符號位為0表示正數,符號位為1表示負數,數值部分一般用二進位制表示:

例如:

+1的原碼為:0000 0001(第乙個0是符號位,表示為正數)

-1的原碼為:1000 0001(第乙個1是符號位,表示為負數)

計算 1 + 2的結果,原碼為:1(0000 0001)、2(0000 0010)

計算:

0000 0001

+0000 0010

——————————

0000 0011 = 3 計算正確!!

如果我們計算 1 - 2 的結果,根據上面所說,計算機內只有加法,所以減法1 - 2可以轉化為加法1 + (-2)的結果,原碼為:1(0000 0001)、-2(1000 0010)

計算:

0000 0001

+1000 0010

——————————

1000 0011 = -3 計算錯誤!!

因此,從上述結果來看,原碼對於加法運算是適用的,但如果是減法此時原碼運算結果會出現問題,該問題是由於帶符號位的負數導致的。

為了解決該問題,我們引入了反碼:1(0000 0001)、-2(1111 1101)

計算:

0000 0001 (反碼)

+1111 1101 (反碼)

——————————

1111 1110 (反碼) 1111 1110是反碼形式,其對應的原碼為1000 0001,即 -1,計算正確!!

通過上述過程,我們知道了引入反碼的意義在於:反碼的引入是為了解決原碼在減法計算中會出現問題。

計算 1 - 1 的結果,轉化為加法即1 + (-1) 原碼為:1(0000 0001)、-1(1000 0001)

反碼為:1(0000 0001)、-1(1111 1110)

計算:

0000 0001

+1111 1110

——————————

1111 1111(反碼),轉化為原碼即 1000 0000(原碼),所以他的意義是 「-0」?,這裡問題出現在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的,0帶符號是沒有任何意義的. 而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0.

於是就引入了補碼概念,補碼是為了解決(-0)這個問題

markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。 —— [ 維基百科 ]

使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細語法參考幫助?。

本編輯器支援markdown extra,  擴充套件了很多好用的功能。具體請參考github.

markdown extra**語法:

專案**

computer

$1600

phone

$12pipe$1

可以使用冒號來定義對齊方式:

專案**

數量computer

1600 元

5phone

12 元

12pipe

1 元234

markdown extra定義列表語法:

專案1

專案2定義 a

定義 b

專案3定義 c

定義 d

定義d內容

**塊語法遵循標準markdown**,例如:

@requires_authorization

defsomefunc

(param1='', param2=0):

'''a docstring'''

if param1 > param2: # interesting

print

'greater'

return (param2 - param1 + 1) or

none

class

someclass:

pass

>>> message = '''interpreter

... prompt'''

生成乙個腳注1.

[toc]來生成目錄:

原碼介紹

反碼介紹

補碼介紹

快捷鍵markdown及擴充套件

離線寫部落格

瀏覽器相容

使用mathjax渲染latex 數學公式,詳見math.stackexchange.com. x

=−b±

b2−4

ac−−

−−−−

−√2a

更多latex語法請參考 這兒.

可以渲染序列圖:

或者流程圖:

即使使用者在沒有網路的情況下,也可以通過本編輯器離線寫部落格(直接在曾經使用過的瀏覽器中輸入write.blog.csdn.net/mdeditor即可。markdown編輯器使用瀏覽器離線儲存將內容儲存在本地。

使用者寫部落格的過程中,內容實時儲存在瀏覽器快取中,在使用者關閉瀏覽器或者其它異常情況下,內容不會丟失。使用者再次開啟瀏覽器時,會顯示上次使用者正在編輯的沒有發表的內容。

部落格發表後,本地快取將被刪除。 

使用者可以選擇 把正在寫的部落格儲存到伺服器草稿箱,即使換瀏覽器或者清除快取,內容也不會丟失。

注意:雖然瀏覽器儲存大部分時候都比較可靠,但為了您的資料安全,在聯網後,請務必及時發表或者儲存到伺服器草稿箱

ie9以下不支援

ie9,10,11存在以下問題

不支援離線功能

ie9不支援檔案匯入匯出

ie10不支援拖拽檔案匯入

這裡是腳注的 內容. ↩

計算機原碼 反碼 補碼理解

計算機使用一定的編碼方式進行儲存,原碼 反碼 補碼是機器儲存乙個具體數字的編碼方式 1 原碼 第一位表示符號 正數第一位為0,負數第一位為1,其餘位表示值 以8位二進位制表示 1 原碼 0000 0001 1 原碼 1000 0001 第一位為符號位 正負數符號位 所以8位二進位制原碼範圍為 111...

計算機 原碼 反碼 補碼

在計算機中,用補碼來表示數字,因為 1 這樣可以比較方便的表示0 保證0作為正數或者負數補碼都是00000000 2 計算時用補碼直接加減就是最終數值 符號位參與運算 1.原碼 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進位制 1 原 0000 0001 1 ...

計算機原碼, 反碼, 補碼

乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數為1.因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 10000011,其最高位1代表負,其真正數值是 3 而不是形式值131 10000011轉換...