關於8位有符號位範圍的問題

以下內容來源網絡:
爲什麼8位有符號數的範圍爲“-128 — +127”?
作者: 爲夢奮鬥中
這是一個困惑了我幾年的問題,它讓我對現在的教科書和老師極其不滿,從我
N年前開始摸電腦時,就幾乎在每一本C++教科書上都說,8 位有符號的取值範圍
是-128~+127,爲什麼不是-127~+127呢,後來的java,int 的聚值範圍,再32 位計
算,-2^31 ~ +2^31-1,可是,卻從來沒有任何一本教科書或一個老師比我解釋過這個
問題。原因沒有在工作上或者是什麼地方直接遇到它,所以我也一直忽略它,但心
裏總是有一根刺.直到剛纔!!!!
就是剛纔,無聊之極,在看彙編的書時,又遇到它了,但一如以往,書上直接地,有心
地,明顯地繞過了這個問題,真是可惡啊.
幾經周折,終於把它搞清楚了:
其實,它是計算機底層爲了實現數值運算而決定的,涉及非常非常基礎的原碼,反
碼,補碼知識,一般(99.9999%)都不會用得上. 那0.0001%,估計也就是計算機考試
了.
話說:
用2^8來表示無符號整數的話,全世界的理解都是0 - 255了,那麼,有符號呢? 用
最高位表示符號,0 爲+,1 爲-,那麼,正常的理解就是-127 至+127 了.
這就是原碼了,值得一提的是,原碼的弱點,有2 個0,即+0 和-0,還有就是,進行異
號相加或同號相減時,比較笨蛋,先要判斷2個數的絕對值大小,然後進行加減操作,
最後運算結果的符號還要與大的符號相同.
於是乎,反碼產生了,原因….略,反正,沒過多久,反碼就成爲了過濾產物,也就是,後
來補碼出現了.
補碼的知識不說述,只說有關+127 和-128 的.
官方的定義[-2^(n-1),2(n-1)-1],補碼的0 沒有正負之分.原因呢?沒有一本書上
有說,這也是我這麼火的原因,但通過思考,google,再思考,很快找到答案:
首先,難不免乾點白癡般地事情,窮舉一下…
正數,原碼跟補碼一樣
+127, 0111 1111
+126, 0111 1110
+125, 0111 1101
+124, 0111 1100
+123, 0111 1011
+122, 0111 1010

+4, 0000 0100
+3, 0000 0011
+2, 0000 0010
+1, 0000 0001
0, 0000 0000 (無正負之分)
下面是負數了,值,原碼,符號位不變其它取反,+1
-1, 1000 0001, 1111 1110, 1111 1111
-2, 1000 0010, 1111 1101, 1111 1110
-3, 1000 0011, 1111 1100, 1111 1101
-4, 1000 0100, 1111 1011, 1111 1100
-5, 1000 0101, 1111 1010, 1111 1011
-6, 1000 0110, 1111 1001, 1111 1010
-7, 1000 0111, 1111 1000, 1111 1001
-8, 1000 1000, 1111 0111, 1111 1000
-9, 1000 1001, 1111 0110, 1111 0111
-10, 1000 1010, 1111 0101, 1111 0110
-11, 1000 1011, 1111 0100, 1111 0101
-12, 1000 1100, 1111 0011, 1111 0100
-13, 1000 1101, 1111 0010, 1111 0011
-14, 1000 1110, 1111 0001, 1111 0010
-15, 1000 1111, 1111 0000, 1111 0001
-16, 1001 0000, 1110 1111, 1111 0000
-17, 1001 0001, 1110 1110, 1110 1111

-24, 1001 1000, 1110 0111, 1110 1000

-99, 1110 0011, 1001 1100, 1110 0100

-124, 1111 1100, 1000 0011, 1000 0100
-125, 1111 1101, 1000 0010, 1000 0011
-126, 1111 1110, 1000 0001, 1000 0010
-127, 1111 1111, 1000 0000, 1000 0001
看出點什麼了沒有?
如果沒有,那麼,給個提示, 再繼續下去,下一個補碼是什麼呢?
當然是
-128, 先略過,再略過, 1000 0000
1000 0000,那麼,它的原碼是什麼呢?
從補碼求原碼的方法跟原碼求補碼是一樣的
先保留符號位其它求反: 1111 1111, 再加1:11000 0000, 超過了8 位了
對,用8 位數的原碼在這裏已經無法表示了
關鍵就在這裏,補碼1000 0000 爲-128 是不用懷疑的(上面的窮舉),
那麼,回到原碼處, 它的原碼也是1000 0000(超出的自動丟失),
1000 0000 在原碼錶示什麼呢? -0, 但補碼卻規定0 沒有正負之分
轉換一下思路,看看計算機裏,是怎麼運算的:
對於負數,先取絕對值,然後求反,加一
-128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000
現在明確了吧.
所以, 8 位有符號的整數取值範圍的補碼錶示
1000 0000 到0000 0000, 再到0111 1111
即-128 到0, 再到127
最終-128 ~ +127

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章