由 -128 引起的思考

  對於 8 位的有符號數而言,它的範圍在 -128~127。該數的範圍若在 -127~127,那還好理解,但關鍵該數還可取值 -128。那 -128 是怎麼來的呢?url

-128 的來源

說法一

  有人就說了,8 位的有符號數除了表示 -127~127,還剩下一個二進制數 「1000 0000B」沒有用,這太浪費了,因此用來表示 -128。這種說法很明顯是站不住腳的。緣由主要有兩個:1)既然浪費,那該二進制數也可用來表示除了 -128 以外的數;2)數學是一門嚴謹的語言,不存在如此模糊的說法。spa

說法二

  還有一個說法,來自百度文庫的一篇文章,即做者經過以下的列舉法:3d

正數:補碼跟原碼同樣
+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,   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

按照規律, -127 的補碼再往下應該還有補碼 「1000 0000」,該二進制數表示 -128。 code

  做者的列舉法看起來確實形象了許多,但卻仍未可以解釋根本的數學原理。blog

說法三

  這種說法是我的的想法,不過跟說法二同樣,都是爲了解釋而解釋。get

  咱們知道 -128 = -127 - 1,那咱們就能夠經過 -127 和 -1 的相加獲得 -128 的補碼了。而 -127 的補碼爲 1000 0001,-1 的補碼爲 1111 1111,二者相加獲得的結果是 1 1000 0000。由於只有 8 位可表示,因此咱們能夠舍掉補碼最高位 1,剩下的就表示 -128 的補碼了,也即 -128 的補碼爲 1000 0000。數學

  這種說法就更加問題多多,並且還牽扯到了溢出問題。io

說法四

  最靠譜的說法必定是來自嚴格的數學推導或定理。class

  通常而言,在計算機中對有符號數的表示方式採用的是 Two's complement (實際上就是補碼)方法。它的數學公式以下:原理

  

  這樣咱們很容易就能夠獲得下邊幾個例子:

  

  同理能夠獲得:

  

  這樣補碼 「1000 0000」 表示 -128 的問題就能夠解決了。咱們所以知道,對於有 w 位補碼(不是原碼或反碼),它可以表示的範圍在:

  固然,用補碼來計算咱們得保證其運算過程的正確性。這方面可參考《深刻理解計算機系統》第 2 章「信息的表示和處理」的第 2.3 節「整數運算」。

-128 + 127 = -1 ?

  在實際研究中,還遇到一些感受很奇怪的問題,例如 -128 加上 127 應該等於多少。咱們從上文已經知道 -128 的補碼是 1000 0000,而 127 的補碼是 0111 1111,那 -128+127 的結果用補碼錶示就是 1111 1111。在思惟沒有切換到原碼以前,老是將 1111 1111 當作 -127,而沒有將其由補碼轉化爲原碼,從而致使理解上的錯誤。

  因此,得時刻記住下圖:

  

相關文章
相關標籤/搜索