導航:首頁 > 源碼編譯 > 計算機源碼反碼補碼的由來

計算機源碼反碼補碼的由來

發布時間:2024-01-05 17:25:42

㈠ 一文搞懂原碼、反碼、補碼

需要聲明的是,本文涉及到的數字及運算均基於 8位bit 下的值。

最高位為符號位,0代表正數,1代表負數,非符號位為該數字絕對值的二進製表示。

如:

127的原碼為0111 1111
-127的原碼為1111 1111

正數的反碼與原碼一致;

負數的反碼是對原碼按位取反,只是 最高位(符號位)不變

如:

127的反碼為0111 1111
-127的反碼為1000 0000

正數的補碼與原碼一致;

負數的補碼是該數的 反碼加1

如:

127的補碼為0111 1111
-127的補碼為1000 0001

總結一下就是:

下面就來探討一下,為雹洞雀啥要用補碼來表示數字。

如果計算機內部採用原碼來表示數,那麼在進行加法和減法運算的時候,需要轉化為兩個絕對值的加法和減法運算;

計算機既要實現加法器,又要實現減法器,代價有點大,那麼可不可以只用一種類型的運算器來實現加和減的遠算呢?

很容易想到的就是 化減為加 ,舉一個生活中的例子來說明這個問題:

時鍾一圈是360度,當然也存在365度,但其實它和5度是一樣的;

相同的道理,-30度表示逆時針旋轉30度,其與順時針旋轉330度是一樣的;

這里數字360表示時鍾的顫棚一圈,在計算機里類似的概念叫 ,它可以實現 化減為加 ,本質上是將 溢出的部分捨去 而不改變結果。

易得,單位元組(8位)運算的模為256=2^8。

在沒有符號位的情況下,127+2=129,即:

這時,我們將最高位作為符號位,計算機數字均以補碼來表示,則1000 0001的原碼為減1後按位取反得1111 1111,也就是-127。

也就是說,計算機里的129即表示-127,相當於模256為一圈,順時針的129則和逆時針127即-127是一樣的。

故可以得到以下結論:

負數的補碼為 模減去該數的絕對值

如-5的補碼為:

-5=256-5=251=1111 1011(二源早進制)

同樣的,臨界值-128也可以表示出來:

-128=256-128=128=1000 0000(二進制)

但是正128就會溢出了,故單位元組(8位)表示的數字范圍為-128--127。

最後,我們來看一下,補碼是如何通過模的 溢出舍棄 操作來完成 化減為加 的!

16-5=16+(-5)=11

1 0000 1011將溢出位捨去,得0000 1011(二進制)=11。

好的,本文分享就到這里,希望能夠幫助到大家。

㈡ 計算機的原碼,反碼,補碼是怎麼回事可以舉例說明嗎

計算機的原碼,反碼,補碼是怎麼回事?

可以舉例說明嗎?

計算機中,並沒有原碼和反碼。

補碼是怎麼回事?

這得從「補數」談起。

計算機所計算的位數,是固定的,如八位機。。。

位數限定之後,就可以用「補數」代替負數,用加法實現減法運算。

如兩位十進制,-1,就可以用 +99 代替。

25 - 1 = 24

25 + 99 = (一百) 24

舍棄進位,只取兩位,這兩種演算法功能就是相同的。

99,就是-1 的補數。計算公式:補數 = 一百+負數。

一百,是兩位十進制數的計數周期。

-------------------------

計算機用二進制,補數,就改稱為:補碼。

八位二進制:0000 0000 ~ 1111 1111 (十進制 255)。

計數周期是:2^8 = 256。

所以,-1 補碼就是 256 + (-1) = 255 = 1111 1111(二進制)。

用不存在的「原碼反碼取反加一」來求,也是這個結果。

求負數補碼的計算公式: 周期 + 該負數。

正數,不用轉換。也可以說,正數自身就是補碼。

-------------------------

可以舉例說明嗎?

例如: 7-3 = 4。

用補碼的計算過程如下:

7 的補碼=0000 0111

-3的補碼=1111 1101

--相加-------------

得(1) 0000 0100 = 4 的補碼

舍棄進位,只保留八位作為結果,這就實現了 7-3。

㈢ 原碼反碼補碼的意義

問題一:原碼、補碼和反碼的概念??? 數在計算機中是以二進制形式表示的。
數分為有符號數和無符號數。
原碼、反碼、補碼都是有符號定點數的表示方法。
一個有符號定點數的最高位為符號位,0是正,1是副。
以下都以8位整數為例,
原碼就是這個數本身的二進制形式。
例如
0000001 就是+1
1000001 就是-1
正數的反碼和補碼都是和原碼相同。
負數的反碼是將其原碼除符號位之外的各位求反
[-3]反=[10000011]反=11111100
負數的補碼是將其原碼除符號位之外的各位求反之後在末位再加1。
[-3]補=[10000011]補=11111101
一個數和它的補碼是可逆的。
為什麼要設立補碼呢?
第一是為了能讓計算機執行減法:
[a-b]補=a補+(-b)補
第二個原因是為了統一正0和負0
正零:00000000
負零:10000000
這兩個數其實都是0,但他們的原碼卻有不同的表示。
但是他們的補碼是一樣的,都是00000000
特別注意,如果+1之後有進位的,要一直往前進位,包括符號位!(這和反碼是不同的!)
[10000000]補
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符號位變成了0)
有人會問
10000000這個補碼表示的哪個數的補碼呢?
其實這是一個規定,這個數表示的是-128
所以n位補碼能表示的范圍是
-2^(n-1)到2^(n-1)-1
比n位原碼能表示的數多一個
又例:
1011
原碼:01011
反碼:01011 正數時,反碼=原碼
補碼:01011 正數時,補碼=原碼
-1011
原碼:11011
反碼:10100 負數時,反碼為原碼取反
補碼:10101 負數時,補碼為原碼取反+1
0.1101
原碼:0.1101
反碼:0.1101 正數時,反碼=原碼
補碼:0.1101 正數時,補碼=原碼
-0.1101
原碼:1.1101
反碼:1.0010 負數時,反碼為原碼取反
補碼:1.0011 負數時,補碼為原碼取反+1
總結:
在計算機內,定點數有3種表示法:原碼、反碼和補碼
所謂原碼就是前面所介紹的二進制定點表示法,即最高位為符號位,「0」表示正,「1」表示負,其餘位表示數值的大小。
反碼表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
1、原碼、反碼和補碼的表示方法
(1) 原碼:在數值前直接加一符號位的表示法。
例如: 符號位 數值位
[+7]原= 0 0000111 B
[-7]原= 1 0000111 B
注意:a. 數0的原碼有兩種形式:
[+0]原=00000000B [-0]原=10000000B
b. 8位二進制原碼的表示範圍:-127~+127
2)反碼:
正數:正數的反碼與原碼相同。
負數:負數的反碼,符號位為「1」,數值部分按位取反。
......>>

問題二:補碼與反碼有什麼用處? 在現在的計算機中,用補碼表示有符號數,其計算方法,和無符號數的計算方法相同,所以可以共用一個運算器。
因此,在計算機里弧,通用的是補碼。
原碼和反碼,都是用於求補碼的中間過程,一般都是寫在紙面上,並不存入計算機。

問題三:計算機的原碼,反碼,補碼是怎麼回事?可以舉例說明嗎? 計算機以二進制補碼存儲數據
以16位機器為例:
比如83的二進制碼為:0000 0000 0101 0011
由於正數的源碼、反嗎、補碼,上面的既是源碼,也是反碼和補碼
下面通過負數講解源碼、反碼、補碼之間的關系
以-83為例
先求出-83絕對值的源碼:0000 0000 0101 0011
計算機區分正負數通過判斷最高位符號位,1為負數、0為正數
那麼-83的源碼為:1000 0000 0101 0011
反碼在源碼基礎上按位取反,符號位不變:1111 1111 1010 1100
補碼在反碼的基礎上加1:111場 1111 1010 1101
補碼轉源碼:補碼基礎上按位取反後加一,符號位在取反時不變,加一時最高位符號位有進位的,進位忽略
取反:1000 0000 0101 0010
加1:1000 0000 0101 0011

問題四:原碼,反碼和補碼表示的規則分別是什麼 一. 機器數和真值
在學習原碼, 反碼和補碼之前, 需要先了解機器數和真值的概念.
1、機器數
一個數在計算機中的二進製表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1.
比如,十進制中的數 +3 ,計算機字長為8位,轉換成二進制就是00000011。如果是 -3 ,就是 10000011 。
那麼,這里的 00000011 和 10000011 就是機器數。
2、真值

為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 10000011,其最高位1代表負,其真正數值是 -3
而不是形式值131(10000011轉換成十進制等於131)。所以,為區別起見,將帶符號位的機器數對應的真正數值稱為機器數的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = C000 0001 = C1
二. 原碼, 反碼, 補碼的基礎概念和計算方法.
在探求為何機器要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念.對於一個數, 計算機要使用一定的編碼方式進行存儲. 原碼, 反碼, 補碼是機器存儲一個具體數字的編碼方式.
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]補
對於負數, 補碼表示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值.

問題五:原碼反碼和補碼區別 原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值,如
[+1]原 = 0000 0001
[-1]原 = 1000 0001
正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
補碼的表示方法是:
正數的補碼就是其本身
負數的補碼是在其原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
正數的源碼,反碼,補碼都一樣

問題六:相對於原碼和反碼,補碼表示法有什麼優點和缺點 原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用:表示負號,數值一般用二進制形式表示。
機器數的反碼可由原碼得到。如果機器數是正數,則該機器數的反碼與原碼一樣;如果機器數是負數,則該機器數的反碼是對它的原碼(符號位除外)各位取反而得到的。
機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,並在未位加1而得到的。
如果是為了考試,死記即可。但我總想搞清楚為什麼計算機裡面的數要這樣子表達?意義何在?-128的補碼為什麼是10000000?為什麼補碼有這么奇怪的運算規則?計算機算減法的時候都需要從源碼到補碼的計算嗎?
思路
google了一下,看到了這樣一篇文章,注意到文中關於補碼來歷的描述,可以總結如下:
計算機裡面,只有加法器,沒有減法器,所有的減法運算,都必須用加法進行。
用補數代替原數,可把減法轉變為加法。出現的進位就是模,此時的進位,就應該忽略不計。
二進制下,有多少位數參加運算,模就是在 1 的後面加上多少個 0。
補碼就是按照這個要求來定義的:正數不變,負數即用模減去絕對值。
補充解釋一下「模」的概念(不準確):
考慮時鍾上時間的計算,假設現在時針指向數字3,若問「6小時前時針指向的數字是幾」,則可以:
1. 將時針逆時針撥動6格。
2. 將時針順時針撥動12 - 6 = 6格。
兩者的結果是一樣的。這里稱12為「模」。
故有 3時 - 6個小時 = 3時 + (12 - 6個小時),這里可以看到將減法轉換成加法的過程,即「加上模減去絕對值的差」。
所以,假設模是10,有效位數為1,當我們計算 9 - 7 的時候:
9 - 7 => 9 + (10 - 7) = 12,去掉最高的位後,得到2,這是正確的結果。
作者的意思是說,計算機裡面所有數都以補碼形式保存,加減運算都是補碼之間的加法運算。然後作者提出了一個我之前沒聽過的觀點:
補數 和 補碼的定義式 裡面,根本就沒有什麼符號位。這最高位的1、0是自然出現的,並不是由人來規定的。
的確,符號位在補碼運算裡面是「模」,本身並不帶符號的意義。因為計算機將加法轉換成加上一個「負數」,而負數又以補碼的形式表現。補碼比源碼多一位,從這多出來的一位可以推斷出原來數字的正負號,所以成為了符號位。也可以這樣認為,留出一位(不全部占滿)的原因是要用「模」來表示正負數。
也就是說,不是特意留出一個符號位,用1和0來表示正負號。而是補碼運算可以用最高位來表示正負,所以符號位誕生了。
那麼為什麼-128的補碼是10000000?可以這樣理解。-128是一個負數,所以它的補碼是它的「模」減去它的絕對值,即:
100000000 - 10000000 = 10000000
那麼為什麼負數補碼等於源碼的反碼加一呢?可以這樣推導:
100000000 - 10000000
= (11111111 + 00000001) - 10000000
= 11111111 - 10000000 + 1
= 01111111 + 1 反碼加一
= 10000000
由此我們得知,在計算機裡面所有的數字都以補碼形式存儲。127存成01111111,-127存成11111111,算減法就變成算加法了,盡管你看到的是「-」號。...>>

問題七:c語言中的原碼,反碼,補碼有什麼作用,是用來做什麼的 計算機中的整數類都是用補碼來存儲的。
而C語言中不需要關心原反補碼!

閱讀全文

與計算機源碼反碼補碼的由來相關的資料

熱點內容
建興app怎麼變成黑色了 瀏覽:49
文件壓縮包如何加密文件 瀏覽:183
2010提出的演算法 瀏覽:672
冰櫃壓縮機的壽命 瀏覽:105
辦公室采訪程序員 瀏覽:569
美橙雲伺服器購買 瀏覽:754
漢語詞典pdf下載 瀏覽:353
android公網ip 瀏覽:613
要塞1地圖放哪個文件夾 瀏覽:850
凡科建站怎麼弄伺服器 瀏覽:939
蘋果手機怎麼設置app播放 瀏覽:202
下載網站源碼用什麼瀏覽器 瀏覽:241
六線譜pdf 瀏覽:156
linuxmysqlsock 瀏覽:239
人教版數學pdf下載 瀏覽:460
文檔安全加密系統 瀏覽:492
數控銑床編程簡單數字 瀏覽:788
編程電纜如何重啟 瀏覽:121
myqq命令行發消息 瀏覽:365
日產逍客怎麼使用app升窗 瀏覽:503