為什麼要定義原碼,反嗎和補碼,為什麼要定義原碼,反嗎和補碼?能夠對十進位制數定義反碼和補碼嗎?

2022-07-09 04:16:09 字數 5194 閱讀 1647

1樓:匿名使用者

其實從原碼到補碼是一個層層遞進的關係,也是一個在錯誤中逐步發展的過程。也就是說利用原碼運算減法時出現的錯誤,為了解決出現了反碼運算,但是反碼運算時又出現了讓人不滿意的地方,於是為了更好的追求出現了補碼。

模、補數的出現

初中還是高中或者是小學讓我們知道了這樣一件事情:

把某物體左旋轉  90 度,和右旋轉 270度,在不考慮圈數的條件下,最終的位置是相同的;

270+90=360;

把分針倒撥 20 分鐘,和正撥 40分鐘,在不考慮時針的條件下,效果也是相同的;

20+40=60;

把數字 87,減去 25,和加上75,在不考慮百位數的條件下,效果也是相同的;

25+75=100;

總之都是會有一定的前提不考慮,可見它們的關係就是互補。而計算得到的360、60、100就是分別在不同情況下的模。知道模,就可以求一個數的補數。

用補數代替原數,就可以用加法代替減法,出現一個進位就是一個模的值。

二進位制的模:

有多少位參加運算,模就是1的後面加上多少個0。

例如:2位二進位制數參加運算,模就是100;即2^2=4

8位二進位制數參加運算,模就是100000000;即2^8=256

二進位制的補碼:

求二進位制數的補數,目的是往計算機裡面存放。一般情況下,都是以

8 位二進位制數來討論補碼。

計算時加上正數,是不需要進行求取補碼的;只有進行減法(或者加上負數),才需要對減數求補碼。補碼就是按照

這個要求來定義的:正數不變,負數即用模減去絕對值。

例如:x = -126,其補碼為 1000 0010,計算方法如下:

1 0000 0000

— 0111 1110

1000 0010

其實就是為了儲存資料,為了計算簡單。既然補碼就可以做到這些了,那為什麼書上還有把原碼和反碼寫出來呢蠱惑人心呢?個人認為它們是沒有太多用處的,在計算機裡是不存在的,就是為了可以形象的說明二進位制是怎麼求出補碼的,只起到一箇中間計算過程的作用,要不一下子寫出一個數的補碼也是要轉幾個彎的。

2樓:乘和

因為用原碼無法表示負數啊

為什麼要定義原碼,反嗎和補碼?能夠對十進位制數定義反碼和補碼嗎?

3樓:做而論道

定義補碼,目的是把減法改成加法。

十進位制數字,就不叫「碼」了,叫做補數。

可以看看:

為什麼要使用原碼,反碼,補碼

4樓:沙裡波特

哪有什麼原碼、反碼!

在計算機中,只使用補碼來存放正負數。

計算機中,以八個二進位制位,作為一個位元組。

數字 0,存放的補碼,就是 0000 0000。

正數,依次遞增,即可:

數字 +1,其補碼就是 0000 0001。

數字 +2,其補碼就是 0000 0010。

。。。負數,就是依次遞減:

數字-1,就是 0000 0000-1 = 1111 1111。

數字-2,就是 1111 1111-1 = 1111 1110。

歸納:正數的補碼,就是:數字本身。

負數的補碼,就是:0 + 該負數。

比如:+9 的補碼是:0000 1001。

-9 的補碼是:0000 0000-0000 1001=1111 0111。

求補碼的計算過程,並不需要原碼反碼。

有了補碼,就可以用加法,代替減法運算了。

比如:(+2)-(+1) = +1。

計算機計算如下:

0000 0010 + 1111 1111= 0000 0001。

5樓:匿名使用者

計算機只能識別0和1,使用的是二進位制。而在日常生活中人們使用的是十進位制,並且我們用的數值有正負之分。於是在計算機中就用一個數的最高位存放符號(0為正,1為負)。

這就是機器數的原碼了。

有了數值的表示方法就可以對數進行算術運算,但是很快就發現用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現了問題,如下:假設字長為8bits

(1) 10 - (1)10 = (1)10 + (-1)10 = (0)10

(0 0000001)原 + (1 0000001)原 = (1 0000010)原 = ( -2 ) 顯然不正確。

因為在兩個整數的加法運算中是沒有問題的,於是就發現問題出現在帶符號位的負數身上。對除符號位外的其餘各位逐位取反就產生了反碼。反碼的取值空間和原碼相同且一一對應。

下面是反碼的減法運算:

(1)10 - (1)10 = (1)10 + (-1)10 = (0)10

(0 0000001)反 + (1 1111110)反 = (1 1111111)反 = ( -0 ) 有問題。

(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10

(0 0000001)反 + (1 1111101)反 = (11111110)反 = (-1) 正確。

問題出現在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的。(印度人首先將零作為標記並放入運算之中,包含有零號的印度數學和十進位制計數對人類文明的貢獻極大)。

於是就引入了補碼概念。負數的補碼就是對反碼加一,而正數的補碼不變,正數的原碼反碼補碼是一樣的。在補碼中用(-128)代替了(-0),這個是人為規定的,所以補碼的表示範圍為:

(-128~0~127)共256個。

注意:(-128)沒有相對應的原碼和反碼, (-128) = (1 0000000) 補碼的加減運算如下:

(1)10 - (1)10 = (1)10 + (-1)10 = (0)10

(0 0000001)補 + (1 1111111)補 = (0 0000000)補 = ( 0 ) 正確。

(1)10 - (2)10 = (1)10 + (-2)10 = (-1)10

(00000001)補 + (11111110)補 = (11111111)補 = (-1) 正確。

所以補碼的設計目的是:

⑴ 使符號位能與有效值部分一起參加運算,從而簡化運算規則。補碼機器數中的符號位,並不是強加上去的,是資料本身的自然組成部分,可以正常地參與運算。

⑵ 使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計。

所有這些轉換都是在計算機的最底層進行的,而在我們使用的彙編、c等其他高階語言中使用的都是原碼。

原碼不是挺好的嗎?為什麼還要反碼和補碼?

6樓:醉倚西風

現在我們知道了計算機可以有三種編碼方式表示一個數. 對於正數因為三種編碼方式的結果都相同:

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

所以不需要過多解釋. 但是對於負數:

[-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] 因為第一位表示的是符號位.而使用補碼錶示時又可以多儲存一個最小值.

反器材狙擊槍和普通狙擊槍有什麼差別嗎?為什麼叫反器材?像

反器材狙擊槍是指的是大口徑的狙擊槍。為什麼這麼說,有以下幾個原因,第 一 大口徑的狙擊槍對於殺傷有生力量來說,其動能已經遠遠超出了,因此發展大口徑狙擊槍主要的戰術目標是輕型的裝甲車,汽車,低空 其他一些沒有重灌甲保護的雷達,通訊設施,電力設施,等等軍用裝置,第 二 這樣的大口徑狙擊槍裝備有高精度的光...

北宋和遼 西夏為什麼要議和,北宋和遼 西夏為什麼要和議?

一開始打不過遼軍,到1004年,遼軍大舉進攻北宋,北宋的宋真率兵出征,宋軍士氣大振,此後,宋遼議和,議和利於遼。而與西夏的議和,因為西夏向宋開戰,為有好相處議和。ps 事實上,北宋的皇帝怕死,沒用啊,比別人強害怕別人.北宋與漢唐等朝不同,從某種意義上講,他並未統一中國。只是佔據了中原之地。所以他並不...

年輕人為什麼要存錢,年輕人為什麼要存錢,為什麼要錢,

很多人都會被灌輸一個想法,錢是省出來 的,尤其是我們家長那一代人更是內如此容。但也有人說過 一旦你有了省錢的腦子,就不會有精力培養一個賺錢的腦袋 對現在的年輕人來說,無論月薪是3000或者1萬,都是月光族,看病的時候沒錢,有想法創業沒錢,甚至買房也沒錢 之前聽過一個事,朋友在給團隊發工資的時候,因為...