關於補碼的解釋

今天講補碼的時候卡殼了,有點尷尬,太想當然了,向童鞋們道歉!在這裏把補碼的原理解釋一遍。

先看8位的二進制的範圍[00000000, 11111111],我們暫時只考慮真值,即這裏面所有的數都表示數值,其對應的十進制數的範圍爲[0, 255],也就是說8位二進制數的模爲256,如果把這個範圍分爲兩部分[00000000, 01111111]和[10000000, 11111111],後面的這一部分是不是剛好可以表示負數的二進制補碼呢?

我們看一個具體的例子,如果我們要表示-3,其二進制補碼爲:

(10000011) = (11111100) = (11111101)

如果只把-3的補碼的編碼當數值看(沒有符號位),則(11111101)2 = 253,那-3和253是什麼關係呢?

-3 + 256 = 253,也就是-3 = 253(mod 256)(注:如果這個不能理解,就假設鐘錶圓盤上有256個刻度,依次標爲0,1, …, 255,在任意一個時刻點,鐘錶順時針撥253個刻度和逆時針撥3個刻度指向同一個刻度)

這下應該明白了。 從這個角度,也就可以解釋5-3=5+(-3)=5+253 (mod 256) = 258 (mod 256) = 2(mod 256),用二進制補碼運算時,將符號位能帶入計算也是因爲這個原因。

回到8位二進制範圍[00000000, 11111111],如果用二進制補碼錶示帶符號數,[00000000, 01111111]表示正數,[10000000, 11111111]表示負數,則(10000001) = -127, (10000010)=-126, …, (11111111) = -1,那多出來的(10000000) = ? 顯然,根據補碼的定義,符號位爲1,這應該是負數,從節約資源的角度,將其定義爲-128最合適,這也就是爲什麼8位二進制補碼的範圍爲[-128~127]的原因。

發佈了26 篇原創文章 · 獲贊 37 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章