關於補碼的解釋

2021-07-24 12:33:19 字數 932 閱讀 6672

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

先看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]的原因。

關於2的補碼

日期 2009年8月 5日 問乙個基本的問題。負數在計算機中如何表示?舉例來說,8在計算機中表示為二進位制的1000,那麼 8怎麼表示呢?很容易想到,可以將乙個二進位制位 bit 專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個位元組的最高位為符號位。那麼,8就...

關於2的補碼

問乙個基本的問題。負數在計算機中如何表示?舉例來說,8在計算機中表示為二進位制的1000,那麼 8怎麼表示呢?很容易想到,可以將乙個二進位制位 bit 專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個位元組的最高位為符號位。那麼,8就是00001000,而 8則...

關於2的補碼

日期 2009年8月 5日 問乙個基本的問題。負數在計算機中如何表示?舉例來說,8在計算機中表示為二進位制的1000,那麼 8怎麼表示呢?很容易想到,可以將乙個二進位制位 bit 專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個位元組的最高位為符號位。那麼,8就...