1. +0或者-0的源碼、反碼、補碼
[+0]原碼=0000 0000, [-0]原碼=1000 0000
[+0]反碼=0000 0000, [-0]反碼=1111 1111
[+0]補碼=0000 0000, [-0]補碼=0000 0000
補碼沒有正0與負0之分。正數的反碼、補碼和其源碼相同,負數的反碼是其源碼,除符號位外其他位取反負數的補碼是取其反碼後加1。
詳細釋義:
所謂原碼就是二進制定點表示法,即最高位為符號位,「0」表示正,「1」表示負,其餘位表示數值的大小。
(一)反碼表示法規定:
1、正數的反碼與其原碼相同;
2、負數的反碼是對正數逐位取反,符號位保持為1;
(二)對於二進制原碼10010求反碼:
((10010)原)反=對正數(00010)原含符號位取反= 反碼11101 (10010,1為符號碼,故為負)
(11101) 二進制= -2 十進制
(三)對於八進制:
舉例 某linux平台設置了默認的目錄許可權為755(rwxr-xr-x),八進製表示為0755,那麼,umask是許可權位755的反碼,計算得到umask為0022的過程如下:
原碼0755= 反碼 0022 (逐位解釋:0為符號位,0為7-7,2為7-5,2為7-5)
(四)補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
(1)37的八位數源碼擴展閱讀
轉換方法
由於正數的原碼、補碼、反碼表示方法均相同,不需轉換。在此,僅以負數情況分析。
(1) 已知原碼,求補碼。
例:已知某數X的原碼為10110100B,試求X的補碼和反碼。
解:由[X]原=10110100B知,X為負數。求其反碼時,符號位不變,數值部分按位求反;求其補碼時,再在其反碼的末位加1。
1 0 1 1 0 1 0 0 原碼
1 1 0 0 1 0 1 1 反碼,符號位不變,數值位取反
1 +1
1 1 0 0 1 1 00 補碼
故:[X]補=11001100B,[X]反=11001011B。
(2) 已知補碼,求原碼。
分析:按照求負數補碼的逆過程,數值部分應是最低位減1,然後取反。但是對二進制數來說,先減1後取反和先取反後加1得到的結果是一樣的,故仍可採用取反加1 有方法。
例:已知某數X的補碼11101110B,試求其原碼。
解:由[X]補=11101110B知,X為負數。
採用逆推法
1 1 1 0 1 1 1 0 補碼
1 1 1 0 1 1 0 1 反碼(末位減1)
1 0 0 1 0 0 1 0 原碼(符號位不變,數值位取反)
2. 二進制的原碼、補碼、反碼詳解
計算機中,並沒有原碼和反碼,只是使用補碼,代表正負數。
使用補碼的意義:可以把減法或負數,轉換為加法運算。從而簡化計算機的硬體。
------------
比如鍾表,時針轉一圈,周期是 12 小時。
倒撥 3 小時,可以用正撥 9 小時代替。
9,就稱為-3 的補數。
計算方法:12-3 = 9。
對於分針,倒撥 X 分,就可以用正撥 60-X 代替。
------------
如果,限定了兩位十進制數 (0~99),周期就是 100。
那麼,減一,就可以用 +99 代替。
24-1 = 23
24 + 99 = (1) 23
忽略進位,只取兩位數,這兩種演算法,結果就是相同的。
於是,99 就是 -1 的補數。
其它負數的補數,大家可以自己求!
求出了負數的補數,就可用加法,代替減法了。
------------
計算機中使用二進制,補數,就改稱為【補碼】。
常用的八位二進制是:0000 0000~1111 1111。
它們代表了十進制:0~255,周期就是 256。
那麼,-1,就可以用 255 = 1111 1111 代替。
所以:-1 的補碼,就是 1111 1111 = 255。
同理:-2 的補碼,就是 1111 1110 = 254。
繼續:-3 的補碼,就是 1111 1101 = 253。
。。。
最後:-128,補碼是 1000 0000 = 128。
計算公式:負數的補碼=256+這個負數。
正數,直接運算即可,不需要求補碼。
也可以說,正數本身就是補碼。
------------
補碼的應用如: 7-3 = 4。
用補碼的計算過程如下:
7 的補碼=0000 0111
-3的補碼=1111 1101
--相加-------------
得:(1) 0000 0100 = 4 的補碼
舍棄進位,只保留八位,作為結果即可。
這就是:使用補碼,加法就代替了減法。
所以,在計算機中,有一個加法器,就夠用了。
原碼和反碼,都沒有這種功能。
------------
原碼和反碼,毫無用處。計算機中,根本就沒有它們。
3. +0或者-0的源碼、反碼、補碼
[+0]原碼=0000 0000, [-0]原碼=1000 0000
[+0]反碼=0000 0000, [-0]反碼=1111 1111
[+0]補碼=0000 0000, [-0]補碼=0000 0000
你會發現,+0和-0的補碼是一樣的。即 0的補碼只有一種表示。
這里解釋一下[-0]補碼是怎麼得來的。
負數的補碼就是反碼整體加一。符號位上的進位舍棄。(所以,舍棄了符號位的補碼的第一位是數值位,不是符號位,符號位舍棄了)
另外解釋一下原碼符號位和補碼符號位的關系,補碼的符號位不是保持原碼的第一位不變,而是 符號位不變,[-0]反碼的第一個1是符號位,尾數中的7個1是數值位,尾數加一後,數值位產生了進位,1111 1111+1=1 0000 0000(計算補碼的過程中,並不是先保證第一位不變,而是保證符號位不變,保證補碼規則是反碼整體加一)。
所以,補碼能表示的數的個數中,比原碼反碼少了一個,所以補碼可以多表示一個真值為-128的數。
但是,多表示的這個數-128比較特殊,只有原碼和補碼,沒有反碼。
-128的補碼是1000 0000。128的補碼為什麼是1000 0000。因為8位二進制的原值表達范圍為:-127至127,共有256個組合序列 0000 0000 至1111 1111 。+128的原值在8位中是表達不出來的。
數值在計算機中是以補碼的方式存儲的,在探求為何計算機要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念。
對於一個數, 計算機要使用一定的編碼方式進行存儲。 原碼, 反碼, 補碼是計算機存儲一個具體數字的編碼方式。
一個數在計算機中的二進製表示形式, 叫做這個數的機器數。
機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1。比如,十進制中的數 +2 ,計算機字長為8位,轉換成二進制就是[00000010]。如果是 -2 ,就是 [10000010] 。
因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 [10000010],其最高位1代表負,其真正數值是 -2 而不是形式值130([10000010]轉換成十進制等於130)。
所以將帶符號位的機器數對應的真正數值稱為機器數的真值。
原碼_網路
反碼_網路
補碼_網路
4. 怎麼求一個負數的原碼和補碼
補碼,來自於:補數。
一般的常識:
鍾表時針,倒撥 3 小時,可以用「正撥 9 小時」來代替。
同理,分針 倒撥 X 分,可以用 正撥 60-X 代替。
60 是分針的周期。
十進制數,兩位:0~99,周期就是一百。
-1 可以用 +99 代替。
如:25 - 1 = 24
25 + 99 = (1) 24
忽略進位 1 百,結果就是相同的。
那麼,-1 的補數,就是 99 。
-2 的補數,就是 98 。
-X 的補數,就差唯是【 周期 + 該負數 】。
--------
藉助於補數,就可以用加法,代替減法運算。
所以,計算機就可以節省硬體了。
--------
八位二進制:0000 0000~1111 1111(0~255)。
周期是 256。
那麼,-1 可以用 1111 1111 (+255) 代替。
即:
沖慶塌-1 的補碼,就是 1111 1111 (= 256-1=+255) 。
-2 的補碼,就是 1111 1110 (= 256-2=+254) 。
。。。
-X 的補碼,就是【 周期 + 該負數 】。散圓
-128,就可以用 1000 0000 (= 128)代替 。
正數,不需要變換,直接運算即可。
--------
在計算機中,負數,就是用補碼存儲、計算的。
原碼和反碼,毫無用處,它們在計算機中都不存在。
5. +0或者-0的源碼、反碼、補碼分別是什麼補碼是一樣的嗎
數字,是以各種代碼,存入計算機的。
數字,可以分成:正數、負數、零。
世界上,只有一個零。
但是,原碼反碼,都編制了兩組代碼!
這就是違反天道了。
-------------------
零的原碼,兩個代碼是:
[+0]原碼 = 0000 0000
[-0]原碼 = 1000 0000
反碼,不甘落後,也是兩個代碼:
[+0]反碼 = 0000 0000
[-0]反碼 = 1111 1111
它們,都是重復定義了「零的編碼」。
計算機,根本就無法使用這種混亂的代碼。
而且,由於零多佔用一組代碼,那麼,所能表示的數字,必然就少一個。
如-128,八位的原碼反碼,都不能表示。
-------------------
在計算機系統中,數值,一律採用補碼表示和存儲。
只用補碼,也是說,原碼和反碼,都無法使用。
補碼的理論,來源於數學的規律,並非是人為的胡編亂造。
零,在補碼中,只用唯一的一組代碼,這就不會產生混亂。
零的八位補碼,就是一個:0000 0000。
並沒有違規的正負零。
-------------------
前面已經說過,原碼反碼,都無法使用。
那麼,求補碼用的「取反加一」,也就失去了理論基礎。
求補碼,是有定義式的。
這定義式,是由數學理論推導出來的,要比胡說八道的「取反加一」更准確嚴密。
當 X >= 0: [ X ]補碼 = X;
當 X < 0: [ X ]補碼 = X + 2^n, n 是補碼的位數。
按照定義式,就可以求出來-128 的八位補碼了:
[-128]補碼 = -128 + 2^8 = 128 = 1000 0000 (二進制)。
如果用「取反加一」,可就難辦了。
因為,-128 並沒有原碼和反碼,拿什麼取反加一!