計算機中數值的三種表示方法詳解 原碼,反碼,補碼

2023-01-25 16:24:03 字數 4973 閱讀 2970

計算機中數值的三種表示方法詳解

原碼,反碼,補碼

最近在學習軟體評測師的知識,其中涉及到計算機的原碼, 反碼和補碼等知識. 通過網上查閱資料,進行了深入學習,分享給大家。本文主要從以下幾點進行介紹:

如何計算原碼,反碼,補碼?為何要使用反碼和補碼?希望本文對大家學習計算機基礎有所幫助

一. 機器數和真值

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

1、機器數

乙個數在計算機中的二進位制表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號, 正數為0, 負數為1.

比如,十進位制中的數 +3 ,計算機字長為8位,轉換成二進位制就是00000011。如果是 -3 ,就是 10000011 。

那麼,這裡的 00000011 和 10000011 就是機器數。

2、真值

因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 10000011,其最高位1代表負,其真正數值是 -3 而不是形式值131(10000011轉換成十進位制等於131)。所以,為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的真值。

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

二. 原碼, 反碼, 補碼的基礎概念和計算方法.

計算機中的符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示「正」,用1表示「負」,而數值位,三種表示方法各不相同。

1. 原碼

原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值. 比如如果是8位二進位制:

[+1]原= 0000 0001

[-1]原= 1000 0001

第一位是符號位. 因為第一位是符號位, 所以8位二進位制數的取值範圍就是:

[1111 1111 , 0111 1111]

即[-127 , 127]

原碼是人腦最容易理解和計算的表示方式.

2. 反碼

反碼的表示方法是:

正數的反碼是其本身

負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.

[+1] = [00000001]原= [00000001]反

[-1] = [10000001]原= [11111110]反

可見如果乙個反碼表示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.

3. 補碼

補碼的表示方法是:

正數的補碼就是其本身

負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)

[+1] = [00000001]原= [00000001]反= [00000001]補

[-1] = [10000001]原= [11111110]反= [11111111]補

對於負數, 補碼表示方式也是人腦無法直**出其數值的. 通常也需要轉換成原碼在計算其數值.

簡單總結以下,反碼和補碼的表示方式以及計算方法.

對於正數,三種編碼方式的結果都相同:

正整數的原碼、反碼、補碼完全一樣,即符號位固定為0,數值位相同。

[+1] = [00000001]原= [00000001]反= [00000001]補

對於負數,三種編碼方式則完全不同:

負整數的符號位固定為1,由原碼變為補碼時,規則如下:

1、原碼符號位1不變,整數的每一位二進位制數字求反,得到反碼

2、反碼符號位1不變,反碼數值位最低位加1,得到補碼

[-1] = [10000001]原= [11111110]反= [11111111]補

可見原碼, 反碼和補碼是完全不同的.

三. 為何要使用原碼, 反碼和補碼

既然原碼才是被人腦直接識別並用於計算表示方式, 為何還會有反碼和補碼呢?

在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。

下面以一些例子進行詳細介紹。

人腦可以知道第一位是符號位, 在計算的時候我們會根據符號位, 選擇對真值區域的加減. (真值的概念在本文最開頭). 但是對於計算機, 加減乘數已經是最基礎的運算, 要設計的盡量簡單.

計算機辨別"符號位"顯然會讓計算機的基礎電路設計變得十分複雜! 於是人們想出了將符號位也參與運算的方法. 我們知道, 根據運算法則減去乙個正數等於加上乙個負數, 即:

1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了.

於是人們開始探索將符號位參與運算, 並且只保留加法的方法. 首先來看原碼:

計算十進位制的表示式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]原+ [10000001]原= [10000010]原= -2

如果用原碼表示, 讓符號位也參與計算, 顯然對於減法來說, 結果是不正確的.這也就是為何計算機內部不使用原碼表示乙個數.

為了解決原碼做減法的問題, 出現了反碼:

計算十進位制的表示式: 1-1=0

1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]反+ [1111 1110]反= [1111 1111]反= [1000 0000]原= -0

發現用反碼計算減法, 結果的真值部分是正確的. 而唯一的問題其實就出現在"0"這個特殊的數值上. 雖然人們理解上+0和-0是一樣的, 但是0帶符號是沒有任何意義的.

而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0.

於是補碼的出現, 解決了0的符號以及兩個編碼的問題:

1-1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]補+ [1111 1111]補= [0000 0000]補=[0000 0000]原

這樣0用[0000 0000]表示, 而以前出現問題的-0則不存在了.而且可以用[1000 0000]表示-128:

(-1) + (-127) = [1000 0001]原+ [1111 1111]原= [1111 1111]補+ [1000 0001]補= [1000 0000]補

-1-127的結果應該是-128, 在用補碼運算的結果中, [1000 0000]補就是-128. 但是注意因為實際上是使用以前的-0的補碼來表示-128, 所以-128並沒有原碼和反碼表示.(對-128的補碼表示[1000 0000]補算出來的原碼是[0000 0000]原, 這是不正確的)

使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示乙個最低數. 這就是為什麼8位二進位制, 使用原碼或反碼表示的範圍為[-127, +127], 而使用補碼表示的範圍為[-128, 127].

因為機器使用補碼, 所以對於程式設計中常用到的32位int型別, 可以表示範圍是: [-231, 231-1] 因為第一位表示的是符號位.而使用補碼表示時又可以多儲存乙個最小值.

四原碼, 反碼, 補碼原理:模的概念

計算機巧妙地把符號位參與運算, 並且將減法變成了加法, 背後蘊含了怎樣的數學原理呢?

模的概念可以幫助理解補數和補碼。「模」是指乙個計量系統的計數範圍。如時鐘等。

計算機也可以看成乙個計量機器,它也有乙個計量範圍,即都存在乙個「模」。例如:時鐘的計量範圍是0~11,模=12。

表示n位的計算機計量範圍是0~2^(n)-1,模=2^(n)。

「模」實質上是計量器產生「溢位」的量,它的值在計量器上表示不出來,計量器上只能表示出模的餘數。任何有模的計量器,均可化減法為加法運算。

假設當前時針指向6點,而準確時間是4點,我希望將時間設定成4點, 需要怎麼做呢?調整時間可有以下兩種撥法:一種是倒撥2小時,即:

6-4=2;另一種是順撥10小時:6+10=12+4=4

1. 往回調2個小時: 6 - 2 = 4

2. 往前撥10個小時: (6 + 10) mod 12 = 4

3. 往前撥10+12=22個小時: (6+22) mod 12 =4

2,3方法中的mod是指取模操作, 16 mod 12 =4 即用16除以12後的餘數是4. 所以鐘錶往回調(減法)的結果可以用往前撥(加法)替代!

現在的焦點就落在了如何用乙個正數, 來替代乙個負數. 上面的例子我們能感覺出來一些端倪, 發現一些規律. 但是數學是嚴謹的. 不能靠感覺.

首先介紹乙個數學中相關的概念: 同餘——兩個整數a,b,若它們除以整數m所得的餘數相等,則稱a,b對於模m同餘

記作 a ≡ b (mod m)

讀作 a 與 b 關於模 m 同餘。

舉例說明:

4 mod 12 = 4

16 mod 12 = 4

28 mod 12 = 4

所以4, 16, 28關於模 12 同餘.

負數取模

正數進行mod運算是很簡單的. 但是負數呢?

下面是關於mod運算的數學定義:

上面是截圖, "取下界"符號找不到如何輸入(word中貼上過來後亂碼). 下面是使用"l"和"j"替換上圖的"取下界"符號:

x mod y = x - y l x / y j

上面公式的意思是:

x mod y等於 x 減去 y 乘上 x與y的商的下界.

以 -3 mod 2 舉例:

-3 mod 2

= -3 - 2xl -3/2 j

= -3 - 2xl-1.5j

= -3 - 2x(-2)

= -3 + 4 = 1

所以:(-2) mod 12 = 12-2=10

(-4) mod 12 = 12-4 = 8

(-5) mod 12 = 12 - 5 = 7

再回到時鐘的問題上:

回撥2小時 = 前撥10小時

回撥4小時 = 前撥8小時

回撥5小時= 前撥7小時

注意, 這裡發現的規律!

結合上面學到的同餘的概念.實際上:

(-2) mod 12 = 10

10 mod 12 = 10

第二章計算機中的資訊表示

一 單項選擇題 請將單項選擇題答案填在下面 1 將外圍裝置與主存統一編址,一般是指 1 每台裝置佔乙個位址碼 2 每個外圍介面佔乙個位址碼 3 每台外設由乙個主存單元管理 4 介面中的有關暫存器各佔乙個位址碼 2 指令格式中的位址結構是指 1 位址段佔多少位 2 指令中採用幾種定址方式 2 指令中如...

計算機中各種數制間的轉化方法

1 二進位制數的運算 電子計算機一般採用二進位制數。二進位制數只有0和1兩個基本數字,容易在電氣元件中實現。二進位制數的運算公式 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 10 1 1 1 二進位制的101 二進位制的010 111 101 010 111 2....

權重的三種計算方法

權重 反映指標在指標體系中重要性程度的數量。研究問題 擇偶指標體系權重集計算 1.外貌 身高 體重 長相魅力 2.性格 情緒穩定性 性格匹配性 性格魅力 3.成就 才華 財富 4.潛力 公升值空間 一 定量統計法 假定隨機抽取50名男大學生,50名女大學生,填寫乙份調查問卷,結果如表1所示 表1 1...