標籤:

補碼10000000為什麼可以表示-128?

計算機 C語言


很多人並不理解補碼。補碼就是同餘啊。1000000是正128你知道吧,正負128模256是同餘的。加減乘可以直接算也是同餘的定理決定的,而不是湊出來的巧合,哪可能湊出這種東西?

8位只能表示256個數,0到255,但我還想表示一些負數怎麼辦呢?就用與該負數同餘的正數來表示唄。-1=255,-2=254,等等。

建議脫離算數的思維方式,這其實就是一個環。模任何一個正整數(如256),可以把所有整數分類,比如模256可分256類,0 256 -256...是一類(餘0類),1 257 -255...是一類(餘1類),等等,這256類可看作環Z_{256}的元素,你看-128和128是同一個類里的(餘128類),用一個代表另一個罷了。補碼和普通的unsigned integers都是在每類中選一個數,unsigned integers選0到255,補碼錶示的有符號整數選-128到127,都是一個數恰好對應一個類。

當你明白這一切後,補碼就是順理成章的事。

練習:設計用8位二進位數表示13至268這256個數的方案。要求作加減乘運算的時候,可以直接把編碼當正整數算,能得到正確結果。


可以參考這個: http://www.zhihu.com/question/20159860/answer/21113783


設w位二進位數x表示為x=[x_{w-1},x_{w-2},...,x_{1},x_{0}]

將該二進位數以補碼的規則解釋,有以下公式

BST_w(x)=-x_{w-1}2^{w-1}+sum_{i=0}^{w-2}{x_i2^{i}}

x=[10000000]

BST_8([10000000])=-1	imes 2^{7}=-127

補碼和原碼的區別就在於最高位的「權重」從2^{w-1}變為-2^{w-1}

為什麼會這樣,樓上各位已經說得很清楚了。

Reference:

Computer Systems - A Programmer"s Perspective 2ed, P60


題主可以試一下(-64)補+(-64)補,看最後的結果是否溢出。

-127的補碼是1000 0001,-128是在它基礎上減一。

別用原碼取反加一的方法去算補碼,別死心眼兒。


都知道第一位表示的是正負符號 則:

0000 0000表示的是0

0111 1111表示的是127,這樣正數0-127就表示完了。

輪到表示負數了,負數第一位為1(規定的) 則:

1000 0001表示的是-1

1111 1111表示的是-127,這樣負數就有-1到-127

發現負數好像還有一個1000 0000,表示0?正數已經有了,那就表示-128吧,不浪費。

你把 1000 0000補碼一下就是 1000 0000


計算機有兩種記數系統,二進位補碼記數法,和余碼記數法。

其中補碼記數系統是這樣構成的,先規定一定長度的0(二進位),接著在這個基礎上,用二進位計數,直到只有一個0,其他都是1,表示數值0,1,2,3……。負數的表示方法是這樣的,先規定一組適當長度的1,然後按照二進位反向計數,直到只有一個1,其他都是0。表示-1,-2,-3……。

具體一點舉個例子。先用基於長度為3的位模式來理解,三個二進位的0,表示0,那麼001表示1,010表示2,011表示3,停!只剩一個0,其他都是1了,此時我們在看負數,按照規定,111表示-1,反向計數開始,110表示-2,101表示-3,100表示-4,停!只剩一個1其餘都是0了。到此我們可以發現長度為3的位模式,可以表示的最小數為-4,即100,同理,如果位長度為4,那麼能表示的最小值為-8,即1000,那麼正常情況下一個位元組是八個位模式,那麼能表示的最小值為-2^7=-128即10000000。

另一種記數方法叫余碼記數法。他是用二進位1,作為最高位的第一個模式來,其餘都是0,來表示數值0。具體參考計算機科學概論1.6節。


因為它加128得0


這真的是定義的,這種定義使得

1. 符號位和數值域統一處理, 第八位用0和1來表示正和負

2. 正數=原碼,負數=反碼加一

你看 127 為 01111111, 那麼 -127 則為 10000000 + 1 = 10000001, 而-128 = -127 - 1, 所以 -128 = 10000000.


[X] + [X]反+1 = 0

[X]反+1 = 0-[X]

[X]反+1 = -[X]

10000000,取反01111111, +1 後為10000000,1000000=128,再加上符號位就是-128


推薦閱讀:

造輪子厲害是一種什麼樣的體驗?
怎樣才算有資格寫技術博客分享?
大家對 Windows Phone 系統的發展怎麼看?
Python3零基礎自學方法?
為什麼這兩個位運算操作結果會不同?

TAG:編程 | 計算機 |