在8位二進位制中, 128 沒有原碼 反碼形式,那麼它的補碼是怎麼計算出來的?還是約定的?

時間 2021-05-07 07:55:15

1樓:looca

使用原碼進行計算的時候,對於人而言能夠很輕易的辨別出符號位,然後直接對其他位數值進行計算。然而對於計算機的設計而言辨別出符號位就是一項非常複雜的工程,所以設計的時候就考慮讓符號位直接參與計算,這樣設計計算機就十分簡單了。 對於加法而言符號位對於計算並沒有影響,對於減法而言則考慮通過加上負數來轉換為加法的方式進行計算。

如果通過原碼來直接進行減法計算:

3 - 2

= 3 + (-2)

= 0000 0011(原) + 1000 0010(原)

= 1000 0101

= -5

結果顯而易見,如果通過原碼來直接讓符號位參與運算的話是不正確的,所以為了解決減法的問題引入了反碼的概念。如果通過反碼來進行減法計算:

3 - 2

= 3 + (-2)

= 0000 0011(原) + 1000 0010(原)

= 0000 0011(反) + 1111 1101(反)

= 1 0000 0000(反) -- 最高位產生進製,結果+1

= 0000 0001(反)

= 0000 0001(原)

= 1結果正確,從上面例子看來如果通過反碼進行減法運算的話是沒有問題的,那為什麼又需要補碼呢,我們一起來看下面這個特殊的例子:

2 - 2

= 2 + (-2)

= 0000 0010(原) + 1000 0010(原)

= 0000 0010(反) + 1111 1101(反)

= 1111 1111(反)

= 1000 0000(原)

= -0

0 + 0

= 0000 0000(原) + 0000 0000(原)

= 0000 0000(反) + 0000 0000(反)

= 0000 0000(反)

= 0000 0000(原)

= 0由於對於0這個數字而言,正負號沒有任何意義,但是經過計算卻有可能出現[0000 0000]和[1000 0000]這兩種不同的原碼表示同乙個數字0,這顯然是不合理的,所以此時就引入了補碼的概念。 如果通過補碼來進行上述例子的計算:

2 - 2

= 2 + (-2)

= 0000 0010(原) + 1000 0010(原)

= 0000 0010(反) + 1111 1101(反)

= 0000 0010(補) + 1111 1110(補)

= 1 0000 0000(補) -- 最高位產生進製,進製捨棄

= 0000 0000(補)

= 0000 0000(反)

= 0000 0000(原)

= 0 0 + 0

= 0000 0000(原) + 0000 0000(原)

= 0000 0000(反) + 0000 0000(反)

= 0000 0000(補) + 0000 0000(補)

= 0000 0000(反)

= 0000 0000(原)

= 0由上述例子可以看出,補碼完美的解決了0的符號問題以及0有兩個不同原碼表示的問題。而且[10000 0000]也可以用來表示-128:

-1 - 127

= -1 + (-127)

= 1000 0001(原) + 1111 1111(原)

= 1111 1110(反) + 1000 0000(反)

= 1111 1111(補) + 1000 0001(補)

= 1 1000 0000(補) --最高位產生進製,進製捨棄

= 1000 0000(補)

-1 - 127的結果為-128,上面例子中-1和-127補碼相加後得出的補碼也是-128。但是這個1000 0000(補)實際上對應的是之前的-0,所以這個補碼是沒有反碼和原碼的。 綜上可以看出使用補碼的話不僅0的符號問題和多原碼問題可以解決,還可以多表示乙個最小數。

2樓:qianggetaba

看了 @Simon Cao 的回答和 負數的補碼怎麼求---沙里波特的回答

簡單總結一下,方便看懂。

從硬體層面看,先是就8位電子電路而言,只能表示00000000--11111111這麼多的數,就是0-255共256個狀態,計算機沒有其他額外電路來標識什麼符號位,小數點位,這是原始碼,還是補碼,反碼,每個額外操作都會使電路複雜,比如符號位不動其他位取反等,這些不是對每一位做相同操作

計算結果要符合人的直觀感受和數學常理

使得電子電路簡單,方便

現在是把00000000--01111111這個範圍表示0到127的正數,10000000---1111111這個範圍對應表示-128到-1的負數(你也可以規定正數範圍縮小點,負數範圍擴大點,當然後續的表示等等可能就需要相應變化,這樣規定肯定是經過多方論證的最優解),就是把128這個二進位制***看成是-128這個數,類似把97的二進位制***看成字母a一樣,都是你腦子想到的,對於計算機,機器,他就是這麼乙個二進位制bit位序列。當你定義乙個變數位-128時,這個變數的記憶體bit位就是10000000,先不要計較計算和其他理論知識,不要去考慮正數補碼是本身,負數補碼計算過程等等

127 + (-128)這樣的兩個數計算,在機器硬體記憶體上就是***直接加法電路按位加***得到1111111,按規則,我們看成是-1,其他數,無論正負加還是負負加,都是電路按位這麼計算

然後就是計算機怎麼把定義變數為-9時,就知道是1111 0111這個bit序列。就是把後面的9轉為二進位制0000 1001,減一,0000 1000,然後全部取反得到,1111 0111,簡單高效

3樓:好為人師

很簡單啊,-127 存在對吧?-127 減一是多少呢?

補碼的特點就是不分正負0,以四位二進位制為例,都是從0000 出發,只是負1是1111,加一為0000,減一為1110,一次類推。那麼正方向最高只有0111,負方向最大為1000。

4樓:

其實,沒什麼原碼、反碼。

原本只表示正數,八位二進位制就是0~256。

現在要表示負數,最高位1是負數,原本的128~256就是負數了。

為了維持負數的大小關係,原來的128就是-128,原來的255就是-1了。

實際上相當於有9位,最高位0表示負數、1表示正數,擷取了中間的256個數,然後扔掉最高位(變成「用1表示負數、用0表示正數」這種大家期待的樣子)。

0 1000 0000(-128)~1 0111 1111(127)。

補碼的意義:

0000'1111+1111'0001=(1)0000'0000

5樓:

要點1 強行記住反碼、補碼的計算規則 markDY

原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用:表示負號,數值一般用二進位制形式表示。

機器數的反碼可由原碼得到。如果機器數是正數,則該機器數的反碼與原碼一樣;如果機器數是負數,則該機器數的反碼是對它的原碼(符號位除外)各位取反而得到的。

機器數的補碼可由反碼直接得到,由原碼間接得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,並在未位加1而得到的。「」除符號位外「」的含義是,在整個運算過程中符號位始終不變,哪怕補碼除符號位外全部是1,在末位加1以後,最高位溢位(我的這個理解是不是錯了?

)。

負數 = [ 1 連線非符號位 ]原 = [ 1 連線非符號位取反 ]反反碼+1]補還是說 [ 1 連線反碼非符號位+1 ]補

是否對於1個負數無論是補碼還是反碼,其符號位都是1 ? @Simon Cao

@Proborn

@DADAman

128的原碼是?

0的原碼是 00000000, 127的原碼是0111 1111, -1 的原碼是 1 000 0001 , -2 的原碼是 1000 0010 (形式上是-1的原碼加1), -127的原碼是 1 111 1111 (形式上是-126的原碼加1);

-128的補碼是10000000 這是怎麼計算出來的? -128的原始碼要如何表示? 是否是 :

0的原碼是 00000000(這個基本是肯定的), -128的原碼是 1000 0000 ?

6樓:

第一名答案看了幾次看得不是很懂。

-128我覺得是就是約定出來的,因為有+0和-0,沒有必要有兩個,為了去掉-0,就產生了反碼,那原來-0的那個二進位製碼(反碼)就空著了,那就給這個約定成-128了。

關於原碼,補碼,反碼的答案可以看這個https://www.

,我看完之後覺得很清晰了,自己都能算了。

還有關於「模」的概念我不是很懂,但是書上有說到超出賦值範圍的數怎麼處理,比如說unsigned char 的範圍是0~255,如果給乙個這樣的變數賦值-1會怎麼辦。我就想到了高中學過的正余弦函式關於週期的概念,把這個unsigned char的範圍想成單位元,0~255,-1就是順時針轉嘛,對應回255咯。

7樓:

補碼並不是必須從原碼、反碼推導出來的編碼,只是恰好數值上有取反加一的對應關係。

補碼的意義在於:按照這樣一種編碼規則(也就是表示正數、負數和零的約定),我們就可以把減法運算變成正數加負數。

不管是原碼、反碼還是補碼,解決的焦點問題是【負數】的編碼問題。

非負數表示為二進位制是直接計算的,而負數如何用二進位制表示就沒有那麼顯然,需要我們額外去規定。於是就有三種方案。這三種方案都可以達到"用二進位制表示負數,能夠和正數區分開,並且和二進位制正數有一定的關係(取反神馬的),使得我們不覺得太彆扭"的目的。

二進位制負數本質上作為一種【編碼】而不是數學上的直接對應,理論上我們也可以規定10000000 ~ 11111111對應任意128個(負)數的排列,你開心就好。只是那樣並沒有什麼卵用,只會在使用中平添許多煩惱,所以並不存在這種亂七八糟的編碼法。

原碼:最大自然的想法就是(對於負數)絕對值佔低7位,用最高位1表示負數。這樣,和正數綜合一下,最高位就是"符號位",後面都是絕對值。

由於8位共256個編碼對稱分成兩部分,最高位是0的"正數部分"和最高位1的"負數部分"。無奈正數部分是0~127,直接對稱就是 -0~-127,就產生了 -0 這麼個尷尬的存在。

利弊:這種編碼方法想法非常直接,但對計算沒有什麼便利,還有 -0 這種冗餘編碼。

反碼:另一種比較自然的想法是,先將數的絕對值用二進位制表示,若是負數則整體取反,否則不變。

利弊:和原碼沒有什麼本質的區別,猜想可能是整體取反比一位取反更好算?

補碼:可能是科學家們在用反碼時發現取反之後再加一的好性質而發明的吧。用 10000000 ~ 11111111對應 -128 ~ -1也是一種可行的編碼方案,而且恰好對應了取模減法的結果:

設x∈,

(-x) = 0 - x

0 - x ≡ 100000000b - x (mod 256)

評價:這種表示法自然消除了編碼反推出的 -0 這種數,而且符合取模減法的運算規則,正數的減法就可以轉變成正數加負數,利於計算機用加法器完成減法運算,因此常用。

結論:補碼是一種有利計算機實現減法的編碼方案,和反碼僅有部分的數值對應關係,並不是有原碼、反碼才能計算補碼。

以上純屬個人腦補,僅供參考。 :)

(卡西歐等)為什麼沒有二進位制 十六進製制計算器(實體)?

小林露露 誰說沒有 程式設計師專用計算器 了呢?德州儀器早在1977年就研發出了專供程式設計師使用的進製轉換專用計算器TI Programmer,本人就收藏有一台改良版本的TI LCD Programmer 隨著積體電路和儲存器技術的飛速發展,這種功能單一的專用計算器早就失去了其存在的意義,而被整合...

如何判斷某個二進位制數如是否存在兩位1中間有包含0的情況?

法國球 如果要求數字不能以0開頭 010011必須改寫成10011 的話,這個問題其實是蠻簡單的。假設這個數是a,如果a 0,那麼它必然以1開頭,又要求兩個1中間不能有0,所以它必須長這樣 a 11 100 0 m個1後面接n個0 這樣就很好辦啦,a 11 100 0 11 1 2 n 2 m 1 ...

怎麼把16位二進位制數轉換為BCD碼 壓縮型BCD碼最大值為999 ,並在螢幕上顯示兩個數?感謝?

快刀老五 有個問題必須先核實,這個16位二進位制數是有符號數還是無符號數?這個問題影響到電路的具體設計,因為你需要乙個除法器,關於除法器的設計自行去搜尋,最簡單的是原碼加減交叉除法器。有了除法器,下面開始轉換。一,16位二進位制數除以10,將得到的餘數取低四位,得到第乙個BCD碼。二,將上次除法運算...