補碼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類可看作環的元素,你看-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表示為
將該二進位數以補碼的規則解釋,有以下公式當時補碼和原碼的區別就在於最高位的「權重」從變為。
為什麼會這樣,樓上各位已經說得很清楚了。
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零基礎自學方法?
※為什麼這兩個位運算操作結果會不同?