補碼的延伸,復制別人的
【復制來的】http://blog.csdn.net/jjhua/article/details/50382563:連接;為了搞明白為什麽8進制補碼表示範圍-128~+127,原碼和反碼表示範圍-127~+127,也就是為什麽會有-128的差別。
綜合了But_Bueatiful博文 C語言關於補碼的解釋及誤區 和百度知道計算機中補碼的符號位可以不做特別對待而直接參加運算。求其證明過程。有些心得。
先抄一段博文裏的內容用於理解模和補數的概念:
模、補數
在日常生活當中,可以看到很多這樣的事情:
把某物體左轉 90 度,和右轉 270 度,在不考慮圈數的條件下,最終的效果是相同的;
把分針倒撥 20 分鐘,和正撥 40 分鐘,在不考慮時針的條件下,效果也是相同的;
把數字 87,減去 25,和加上 75,在不考慮百位數的條件下,效果也是相同的;
……。
上述幾組數字,有這樣的關系:
90 + 270 = 360
20 + 40 = 60
25 + 75 = 100
式中的 360、60 和 100,就是“模”(也可以理解成“進制”)。
式中的 90 和 270、20 和 40,以及 25 和 75,就是一對對“互補”的數字。
知道了“模”,求某個數字的“補數”,就是輕而易舉的了:
如果模為 365,數字 120 的補數為:365 - 120 = 245。
用補數代替原數,可把減法轉變為加法。出現的進位就是模,此時的進位,就應該忽略不計。
二進制數的模
前面說過的十進制數 25 和 75,它們是 2 位數的運算,模是 100,即 1 的後面加上 2 個 0。
如果有 3 位數參加運算,模就是 1000,即 1 的後面加上 3 個 0。
這裏的 1000,是十進制數的一千,可以寫成 10^3,即 10 的 3 次方。
推論:有多少位數參加運算,模就是在 1 的後面加上多少個 0。
對於二進制數字,模也是這樣推算。
如果是 3 位二進制數參加運算,模就是 1000,即 1 的後面加上 3 個 0;
那麽當 8 位二進制數參加運算,模就是 1 0000 0000,即 1 的後面加上 8 個 0。
16 位二進制數參加運算,模可就大了,是 1 的後面加上 16 個 0。
註意:這裏提到的 1、0,都是二進制數。
8 位二進制數的模可以按照十進制寫成 2^8,即 256。
16 位數二進制數的模,就是 2^16,按照十進制,它就是 65536。
再抄一段百度知道內容用於理解如何快速計算負數的補碼
可以想像一下,有個小孩子,很小,不很識數,只認識 0 ~ 99,還不會做減法。
教這樣的小孩做減法,就可以告訴他:-1,可以用+99來代替。
24 - 1 = 23
24 + 99 = (1)23
忽略進位,是不是就是一樣的?
那麽,98,就是-2;
97,就是 -3;
……
50,就是 -50。
看明白這些,就可以理解了《補碼定義式》。
--
對於八位的二進制數,是 0 ~ 1111 1111(255);
255,就是 -1;
254,就是 -2;
……
128,就是-128。
這就是按照《補碼定義式》,求出來的《負數的補碼》。
而 0~127,按照《補碼定義式》,就是《正數的補碼》。
總結:
所以存在補碼定義式:
[X]補 = X 當 X 大於等於0 時
[X]補 = 模 - |X| 當 X 小於 0 時
舉例說明:
八位二進制 ,註意:沒有符號位,全部作為數據位,則最大值為八個1即 1111 1111B,那麽模即為 1 0000 0000B,也就是最大值+1,十進制值為256
零和正數的補碼即為十進制轉為二進制的結果,如0 的補碼 0000 0000B ,+127的補碼 0111 1111B
負數的補碼即為 負數的補數 的二進制形式,負數的補數=模-|負數|
舉例求-3的補碼:
-3的補數=256-3=253 ,轉換為二進制1111 1101,此即為-3的補碼。
可以通過書上講的原反補過程驗證一下,-3的原碼是1000 0011 ,反碼是除符號位以外取反結果為1111 1100 ,補碼是反碼+1,最終結果即為1111 1101,與上面結果一致。
做兩個算術運算:
假設前提8位二進制。
分別計算 5-3 和 3-5 兩個式子結果,結果用補碼表示。
5-3 即為 5+(256-3)= 258 = 1 0000 0010B,拋棄超出的高位1,結果為 0000 0010B,很明顯為2的補碼
3-5 即為 3+(256-5)= 254 = 1111 1110B,按書上原反補計算方法,-2原碼1000 0010B 反碼1111 1101B 補碼1111 1110B,一致。
補碼的延伸,復制別人的