對於 8 位的有符號數而言,它的範圍在 -128~127。該數的範圍若在 -127~127,那還好理解,但關鍵該數還可取值 -128。那 -128 是怎麼來的呢?url
有人就說了,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 應該等於多少。咱們從上文已經知道 -128 的補碼是 1000 0000,而 127 的補碼是 0111 1111,那 -128+127 的結果用補碼錶示就是 1111 1111。在思惟沒有切換到原碼以前,老是將 1111 1111 當作 -127,而沒有將其由補碼轉化爲原碼,從而致使理解上的錯誤。
因此,得時刻記住下圖: