原碼檀何、反碼蝇裤、補(bǔ)碼和移碼詳解

到目前為止,我們學(xué)習(xí)了十進(jìn)制频鉴、二進(jìn)制栓辜、八進(jìn)制、十六進(jìn)制等用來代表實(shí)際數(shù)值的數(shù)垛孔,稱為真值藕甩,這些數(shù)我們?cè)偃粘I钪卸紩?huì)使用到,那么在計(jì)算機(jī)中數(shù)值是怎么來表示的呢周荐?
??數(shù)在計(jì)算機(jī)中的表示形式統(tǒng)稱為機(jī)器數(shù)狭莱。計(jì)算機(jī)中處理數(shù)據(jù)及運(yùn)算都是采用二進(jìn)制,通常規(guī)定機(jī)器數(shù)用八位二進(jìn)制表示概作。實(shí)用的數(shù)據(jù)有正數(shù)和負(fù)數(shù)腋妙,因?yàn)橛?jì)算機(jī)只能表示0、1兩種狀態(tài)讯榕,數(shù)據(jù)的正號(hào)“+”或負(fù)號(hào)“-”骤素,在計(jì)算機(jī)里就用一位二進(jìn)制的0或1來區(qū)別,通常放在最高位愚屁,成為符號(hào)位济竹。 符號(hào)位數(shù)值化之后,為能方便的對(duì)機(jī)器數(shù)進(jìn)行算術(shù)運(yùn)算霎槐、提高運(yùn)算速度送浊,計(jì)算機(jī)設(shè)計(jì)了多種符號(hào)位與數(shù)值一起編碼的方法,最常用的機(jī)器數(shù)表示方法有:原碼栽燕、反碼罕袋、補(bǔ)碼和移碼改淑,下面就分別介紹一下它們的表示方法。

0X01 原碼浴讯、反碼朵夏、補(bǔ)碼和移碼

  • 原碼:正數(shù)是其二進(jìn)制本身;負(fù)數(shù)是符號(hào)位為1,數(shù)值部分取X絕對(duì)值的二進(jìn)制榆纽。
  • 反碼:正數(shù)的反碼和原碼相同仰猖;負(fù)數(shù)是符號(hào)位為1,其它位是原碼取反。
  • 補(bǔ)碼:正數(shù)的補(bǔ)碼和原碼奈籽,反碼相同饥侵;負(fù)數(shù)是符號(hào)位為1,其它位是原碼取反衣屏,未位加1躏升。(或者說負(fù)數(shù)的補(bǔ)碼是其絕對(duì)值反碼未位加1)
  • 移碼:將符號(hào)位取反的補(bǔ)碼(不區(qū)分正負(fù))

舉個(gè)例子以一個(gè)字節(jié)8位說明:

編碼 10810(sbyte) -10810(sbyte)
原碼 01101100 11101100
反碼 01101100 10010011
補(bǔ)碼 01101100 10010100
移碼 11101100 00010100

注:加粗的數(shù)字為符號(hào)位,補(bǔ)碼在線工具
??移碼表示法是在數(shù)X上增加一個(gè)偏移量來定義的狼忱,常用來表示浮點(diǎn)數(shù)中的階碼膨疏,所以是整數(shù)。如果機(jī)器字長(zhǎng)為n钻弄,規(guī)定偏移量為2(n-1)佃却。若X是整數(shù),則X=2^(n-1)+X
例子:假設(shè)字長(zhǎng)為8窘俺,以上面的108為例
108=10000000+01101100=11101100
-108=10000000+10010100=00010100

0X02 補(bǔ)碼求原碼

已知一個(gè)數(shù)的補(bǔ)碼饲帅,求原碼的操作分兩種情況:
如果補(bǔ)碼的符號(hào)位為“0”,表示是一個(gè)正數(shù)瘤泪,所以補(bǔ)碼就是該數(shù)的原碼灶泵。
如果補(bǔ)碼的符號(hào)位為“1”,表示是一個(gè)負(fù)數(shù)均芽,求原碼的操作可以是:符號(hào)位為1丘逸;其余各位取反单鹿,然后再整個(gè)數(shù)加1掀宋。

0X03 補(bǔ)碼加、減運(yùn)算公式

  • 在做補(bǔ)碼加減法時(shí)仲锄,只需將符號(hào)位和數(shù)值部分一起參與運(yùn)算劲妙,并且將符號(hào)位產(chǎn)生的進(jìn)位丟掉即可
  • 補(bǔ)碼加法公式
    ??[X+Y]補(bǔ) = [X]補(bǔ) + [Y]補(bǔ)
  • 補(bǔ)碼減法公式
    ??[X-Y]補(bǔ) = [X]補(bǔ)-[Y]補(bǔ) = [X]補(bǔ) + [-Y]補(bǔ)
    其中:[-Y]補(bǔ)稱為負(fù)補(bǔ),求負(fù)補(bǔ)的辦法是:對(duì)補(bǔ)碼的每一位(包括符合位)求反,且未位加1.

假設(shè)字長(zhǎng)為8的計(jì)算機(jī)sbyte類型所能表示的最大數(shù)是11111111儒喊,若再加1稱為100000000(9位)镣奋,但因只有8位,最高位1自然丟失怀愧。又回了00000000侨颈,所以字長(zhǎng)為8的二進(jìn)制系統(tǒng)的模為2^8余赢。

0X04 為何要使用原碼, 反碼和補(bǔ)碼

在開始深入學(xué)習(xí)前, 我的學(xué)習(xí)建議是先"死記硬背"上面的原碼, 反碼和補(bǔ)碼的表示方式以及計(jì)算方法.

現(xiàn)在我們知道了計(jì)算機(jī)可以有三種編碼方式表示一個(gè)數(shù). 對(duì)于正數(shù)因?yàn)槿N編碼方式的結(jié)果都相同:

[+1] = [00000001] = [00000001] = [00000001]補(bǔ)

所以不需要過多解釋. 但是對(duì)于負(fù)數(shù):

[-1] = [10000001]= [11111110]= [11111111]補(bǔ)

可見原碼, 反碼和補(bǔ)碼是完全不同的. 既然原碼才是被人腦直接識(shí)別并用于計(jì)算表示方式, 為何還會(huì)有反碼和補(bǔ)碼呢?

首先, 因?yàn)槿四X可以知道第一位是符號(hào)位, 在計(jì)算的時(shí)候我們會(huì)根據(jù)符號(hào)位, 選擇對(duì)真值區(qū)域的加減. (補(bǔ)碼的絕對(duì)值稱為真值即去掉符號(hào)位的二進(jìn)制數(shù)字). 但是對(duì)于計(jì)算機(jī), 加減乘數(shù)已經(jīng)是最基礎(chǔ)的運(yùn)算, 要設(shè)計(jì)的盡量簡(jiǎn)單. 計(jì)算機(jī)辨別"符號(hào)位"顯然會(huì)讓計(jì)算機(jī)的基礎(chǔ)電路設(shè)計(jì)變得十分復(fù)雜! 于是人們想出了將符號(hào)位也參與運(yùn)算的方法. 我們知道, 根據(jù)運(yùn)算法則減去一個(gè)正數(shù)等于加上一個(gè)負(fù)數(shù), 即: 1-1 = 1 + (-1) = 0 , 所以機(jī)器可以只有加法而沒有減法, 這樣計(jì)算機(jī)運(yùn)算的設(shè)計(jì)就更簡(jiǎn)單了.

于是人們開始探索 將符號(hào)位參與運(yùn)算, 并且只保留加法的方法. 首先來看原碼:

計(jì)算十進(jìn)制的表達(dá)式: 1-1=0

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

如果用原碼表示, 讓符號(hào)位也參與計(jì)算, 顯然對(duì)于減法來說, 結(jié)果是不正確的.這也就是為何計(jì)算機(jī)內(nèi)部不使用原碼表示一個(gè)數(shù).

為了解決原碼做減法的問題, 出現(xiàn)了反碼:

計(jì)算十進(jìn)制的表達(dá)式: 1-1=0

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

發(fā)現(xiàn)用反碼計(jì)算減法, 結(jié)果的真值部分是正確的. 而唯一的問題其實(shí)就出現(xiàn)在"0"這個(gè)特殊的數(shù)值上. 雖然人們理解上+0和-0是一樣的, 但是0帶符號(hào)是沒有任何意義的. 而且會(huì)有[0000 0000]和[1000 0000]兩個(gè)編碼表示0.

于是補(bǔ)碼的出現(xiàn), 解決了0的符號(hào)以及兩個(gè)編碼的問題:

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

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

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

-1-127的結(jié)果應(yīng)該是-128, 在用補(bǔ)碼運(yùn)算的結(jié)果中, [1000 0000]補(bǔ)就是-128. 但是注意因?yàn)閷?shí)際上是使用以前的-0的補(bǔ)碼來表示-128, 所以-128并沒有原碼和反碼表示.(對(duì)-128的補(bǔ)碼表示[1000 0000]補(bǔ)算出來的原碼是[0000 0000], 這是不正確的)

使用補(bǔ)碼, 不僅僅修復(fù)了0的符號(hào)以及存在兩個(gè)編碼的問題, 而且還能夠多表示一個(gè)最低數(shù). 這就是為什么8位二進(jìn)制, 使用原碼或反碼表示的范圍為[-127, +127], 而使用補(bǔ)碼表示的范圍為[-128, 127].

因?yàn)闄C(jī)器使用補(bǔ)碼, 所以對(duì)于編程中常用到的32位int類型, 可以表示范圍是: [-231, 231-1] 因?yàn)榈谝晃槐硎镜氖欠?hào)位.而使用補(bǔ)碼表示時(shí)又可以多保存一個(gè)最小值.

總結(jié):

  • 原碼負(fù)數(shù)不能參與運(yùn)算并且不能做減法運(yùn)算
  • 反碼的+0和-0的反碼不相同
  • -128在運(yùn)算中的補(bǔ)碼是 [1000 0000]補(bǔ),并沒有原碼和反碼表示

引用的文章:
http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
http://blog.csdn.net/peng_weida/article/details/7931990

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哈垢,一起剝皮案震驚了整個(gè)濱河市妻柒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耘分,老刑警劉巖举塔,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異求泰,居然都是意外死亡央渣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門渴频,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芽丹,“玉大人,你說我怎么就攤上這事卜朗≈狙埽” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵聊替,是天一觀的道長(zhǎng)楼肪。 經(jīng)常有香客問我,道長(zhǎng)惹悄,這世上最難降的妖魔是什么春叫? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮泣港,結(jié)果婚禮上暂殖,老公的妹妹穿的比我還像新娘。我一直安慰自己当纱,他們只是感情好呛每,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坡氯,像睡著了一般晨横。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箫柳,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天手形,我揣著相機(jī)與錄音,去河邊找鬼悯恍。 笑死库糠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涮毫。 我是一名探鬼主播瞬欧,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼贷屎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了艘虎?” 一聲冷哼從身側(cè)響起豫尽,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顷帖,沒想到半個(gè)月后美旧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贬墩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年榴嗅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陶舞。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗽测,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肿孵,到底是詐尸還是另有隱情唠粥,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布停做,位于F島的核電站晤愧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛉腌。R本人自食惡果不足惜官份,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烙丛。 院中可真熱鬧舅巷,春花似錦、人聲如沸河咽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忘蟹。三九已至飒房,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寒瓦,已是汗流浹背情屹。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杂腰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓椅文,卻偏偏與公主長(zhǎng)得像喂很,于是被迫代替她去往敵國(guó)和親惜颇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容