深入理解計算機中的原碼嫁盲、補碼、反碼

基本數(shù)據(jù)類型

image
image

image
image

計算機底層存儲數(shù)據(jù)時使用的是二進制數(shù)字烈掠,但是計算機在存儲一個數(shù)字時并不是直接存儲該數(shù)字對應的二進制數(shù)字羞秤,而是存儲該數(shù)字對應二進制數(shù)字的補碼。所以接下來我們需要來了解一下原碼向叉、反碼補碼锥腻。

image
  • 機器數(shù):一個數(shù)在計算機的存儲形式是二進制數(shù),我們稱這些二進制數(shù)為機器數(shù)母谎,機器數(shù)是有符號,在計算機中用機器數(shù)的最高位存放符號位京革,0表示正數(shù)奇唤,1表示負數(shù)。
  • 機器數(shù)的真值:因為帶有符號位匹摇,所以機器數(shù)的形式值不等于其真值咬扇,以機器數(shù)1000 0111為例,其真正表示的值為-7廊勃,而形式值為135懈贺。將帶符號的機器數(shù)的真正表示的值稱為機器數(shù)的真值。

image

原碼

原碼的表示與機器數(shù)真值表示的一樣坡垫,即用第一位表示符號梭灿,其余位表示數(shù)值,例如的十進制的的正負1冰悠,用8位二進制的原碼表示如下:

【+1】= 原:[ 0000 0001 ]

【-1】= 原:[ 1000 0001 ]


反碼

反碼的表示方法為:

  • 正數(shù)的反碼是其原碼本身堡妒。
  • 負數(shù)的反碼是在其原碼的基礎上,符號位不變溉卓,其余各位取反皮迟。

【+1】= 原: [ 0000 0001 ] = 反:[ 0000 0001 ]

【-1】 = 原:[ 1000 0001 ] = 反:[ 1111 1110 ]


補碼

補碼的表示方法為:

  • 正數(shù)的補碼是其原碼本身。
  • 負數(shù)的補碼是在其原碼的基礎上桑寨,符號位不變伏尼,其余各位取反后加1(即在反碼的基礎上加1)。

【+1】= 原: [ 0000 0001 ] = 反:[ 0000 0001 ] = 補:[ 0000 0001 ]

【-1】 = 原:[ 1000 0001 ] = 反:[ 1111 1110 ] = 補:[ 1111 1111 ]


數(shù)據(jù)在計算機中的存儲形式

計算機實際只存儲補碼尉尾, 所以原碼轉(zhuǎn)換為補碼的過程爆阶,也可以理解為數(shù)據(jù)存儲到計算機內(nèi)存中的過程:

image

在原、反、補碼中扰她,正數(shù)的表示是一模一樣的兽掰,而負數(shù)的表示是不相同的,所以對于負數(shù)的補碼來說徒役,我們是不能直接用進制轉(zhuǎn)換將其轉(zhuǎn)換為十進制數(shù)值的孽尽,因為這樣是得不到計算機真正存儲的十進制數(shù)的,所以應該將其轉(zhuǎn)換為原碼后忧勿,再將轉(zhuǎn)換得到的原碼進行進制轉(zhuǎn)換為十進制數(shù)杉女。(機器數(shù)包含符號位)

image

問題:為何使用原碼、反碼鸳吸、補碼

我們上面說過熏挎,原碼、反碼晌砾、補碼的表示對于正數(shù)來說都是一樣的坎拐,而對于負數(shù)來說,三種碼的表示確是完全不同的养匈,那大家是否會有個疑問:如果原碼才是我們?nèi)祟惪梢宰R別并用于直接計算的表示方式哼勇,那為什么還會有反碼和補碼?計算機直接存儲原碼不就完事了呕乎?

在解決這些問題前积担,我們先來了解計算機的底層概念,我們?nèi)四X可以很輕松的知道機器數(shù)的第一位是符號位猬仁,但對于計算機基礎電路設計來說判別第一位是符號位是非常難和復雜的事情帝璧,為了讓計算機底層設計更加簡單,人們開始探索將符號位參與運算湿刽,并且采用只保留加法的方法的烁,我們知道減去一個數(shù),等于加上這個數(shù)的負數(shù)叭爱,即:1-1 = 1 + (-1) = 0撮躁,這樣讓計算機運算就更加簡單了,并且也讓符號位參與到運算中去买雾。

1.使用原碼運算

計算十進制表達式:1-1 = 0把曼;

1 - 1 = 1 + (-1)

= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]

= 原:[ 1000 0010 ] = -2

如果用原碼表示,讓符號位也參與計算漓穿,對于減法來說嗤军,結果是不正確的。這也是計算機內(nèi)部在存儲數(shù)據(jù)時不使用原碼的原因晃危,為了解決這一問題叙赚,出現(xiàn)了反碼老客。


2.使用反碼運算

計算十進制表達式:1-1 = 0

1 - 1 = 1 + (-1)

= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]

= 反:[ 0000 0001 ] + 反:[ 1111 1110 ]

= 反:[ 1111 1111 ] = 原: [ 1000 0000 ] = -0

通過計算我們發(fā)現(xiàn)用反碼計算減法,結果的真值部分是正確的震叮。而唯一的問題出現(xiàn)在"0"這個特殊的數(shù)值上胧砰,雖然人們理解上+0和-0是一樣的,但是0帶符號是沒有任何意義的苇瓣,而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0尉间。為了解決這一問題,出現(xiàn)了補碼击罪。


3.使用補碼運算

1 - 1 = 1 + (-1)

= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]

= 補:[ 0000 0001 ] + 補:[ 1111 1111 ]

= 補: [ 0000 0000 ] = 原: [ 0000 0000 ] = 0

這樣0用[0000 0000]表示哲嘲,而以前出現(xiàn)問題的-0則不存在了,而且人們還發(fā)現(xiàn)可以用[1000 0000]表示-128媳禁,-128的推算過程如下

(-1) + (-127) = -128

= 原:[1000 0001] + 原:[ 1111 1111 ]

= 補:[ 1111 1111 ] + 補:[ 1000 0001 ]

= 補:[ 1000 0000 ]

注意:因為實際上是使用以前的-0的補碼來表示-128眠副,所以-128并沒有原碼和反碼表示,只要補碼是[1000 0000]竣稽,其十進制數(shù)值就為-128囱怕。


因為補碼能多存儲一個-128,而且在計算機底層中存儲的是補碼丧枪,所以在計算機中一個8位的二進制數(shù)的存儲范圍是用補碼表示的[-128,127]光涂,而不是用原碼或反碼表示的[-127,127]。這也可以解釋為什么計算機中一個字節(jié)的取值范圍是[-128,127]拧烦。

這樣也能夠回答我們開始提出的問題了,原碼钝计、反碼恋博、補碼的使用,是人們?yōu)榱俗尫栁荒軈⑴c運算并讓計算機底層運算更加簡單而設計出來的數(shù)據(jù)存儲表示方式私恬。

image
image
image

本文轉(zhuǎn)至微信公眾號:【平兄聊Java】

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末债沮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子本鸣,更是在濱河造成了極大的恐慌疫衩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荣德,死亡現(xiàn)場離奇詭異闷煤,居然都是意外死亡,警方通過查閱死者的電腦和手機涮瞻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門鲤拿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人署咽,你說我怎么就攤上這事近顷∩簦” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵窒升,是天一觀的道長缀遍。 經(jīng)常有香客問我,道長饱须,這世上最難降的妖魔是什么域醇? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮冤寿,結果婚禮上歹苦,老公的妹妹穿的比我還像新娘。我一直安慰自己督怜,他們只是感情好殴瘦,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著号杠,像睡著了一般蚪腋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姨蟋,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天屉凯,我揣著相機與錄音,去河邊找鬼眼溶。 笑死悠砚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的堂飞。 我是一名探鬼主播灌旧,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绰筛!你這毒婦竟也來了枢泰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤铝噩,失蹤者是張志新(化名)和其女友劉穎衡蚂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骏庸,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡毛甲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了敞恋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丽啡。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖硬猫,靈堂內(nèi)的尸體忽然破棺而出补箍,到底是詐尸還是另有隱情改执,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布坑雅,位于F島的核電站辈挂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裹粤。R本人自食惡果不足惜终蒂,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遥诉。 院中可真熱鬧拇泣,春花似錦、人聲如沸矮锈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苞笨。三九已至债朵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瀑凝,已是汗流浹背序芦。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粤咪,地道東北人谚中。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像寥枝,于是被迫代替她去往敵國和親藏杖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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