簡單的說,計算機就是晶體管、電路板組裝起來對的電子設備,不管是圖形圖像的渲染、網絡遠程共享,仍是大數據計算,歸根結底都是 0 與 1 的信號處理。信息存儲和邏輯計算的元數據,只能是 0 與 1,可是它們在不一樣介質裏的物理表現方式倒是不同的,如三極管的斷電與通電、CPU的低電平與高電平、磁盤的電荷左右方向。明確了0與1的物理表現方式後,設定基數爲2,進位規則是「逢二進一」,借位規則是「借一當二」,因此稱爲二進制。網絡
迴歸正題,如何計算二進制數的取值範圍呢?好比,Java中的 int 數據類型是32位,那麼 int 所能表現的範圍是多少呢?大數據
設想有 8 條電路,每條電路有低電平和高電平兩種狀態。根據數學排列組合,有 8 個 2 相乘,即 2^8,可以表示 256 種不一樣的信號。假設表示區間爲 0~255,最大數即爲 2^8 -1 = 256 -1 = 255,減去 1 的緣由是由於第一個數用來表示 0,因此可表示的總數減 1 就等於最大數,那麼 32 條電路可以表示的最大數爲 (2^32-1)= 4,294,967,295。平時所說的 32 位機器,就可以同時處理字長爲 32 位的電路信號。開發
如何表示負數呢?上面的 8 條電路,最左側的一條表示正負,0 表示正數,1 表示負數,該位爲符號位,不參與數值運算表示。8 條電路,實際的數值部分只有 7 位,那麼最大值用二進制表示即爲 0111 1111 即 127。數學
你也能夠換種思惟去理解,數值部分有 7 位,根據數學排列組合,有 7 個 2 相乘,即 2^7 ,可以表示 128 種信號。加上第一位符號位的 0 或 1,可以表示 128 x 2 = 256 種信號。包括正數 128 個、負數 128 個,範圍即 0 ~ 12七、-128 ~ -1,表示範圍因有正負之分而改變爲 -128 ~127。渲染
二進制整數最終都是以補碼形式出現的。正數的補碼與原碼、反碼是同樣的,而負數的補碼是反碼加 1 的結果。這樣使減法運算能夠使用加法器實現,符號位也參與運算。須要注意的是,負數的原碼、反碼、補碼的符號位始終是 1,只有數值部分參與原碼到反碼、原碼到補碼的轉換運算。數據類型
回到原來的問題,Java中的 int 數據類型是 32 位,那麼 int 所能表現的範圍是多少呢?二進制
數值部分所能表示的範圍個數是 2^31,算上符號位的 0 或 1,即正數範圍 0 ~ 2^31-1,負數範圍爲 -2^31 ~ -1,合計爲 -2^31 ~ 2^31-1。數據
《碼出高效:Java開發手冊》計算機