您好,登錄后才能下訂單哦!
為什么一個byte的存儲范圍是-128~127?
文本關鍵字:byte、字節、二進制位、反碼、補碼
文章目錄
為什么一個byte的存儲范圍是-128~127?
**1. 反碼
1 byte = 8 bit(比特)
這8個bit就是8個二進制位,其中有一個是符號為,剛好可以用0和1來代表正負。那么這8個二進制位到底能夠表示多大范圍的數字呢?對于正數的進制轉換相信難不倒大家,也可以參考底部的相關文章,我們先來看一下負數在二進制下是如何表示和轉換的。
二、反碼與補碼
首先把公式立在這里:
正數的補碼 = 原碼 = 反碼
負數的補碼 = 反碼 + 1
那么首先什么是原碼呢?很簡單,在我們不考慮符號的情況下,按照進制的轉換方法將一個十進制數轉換為二進制數,再添加上相應的符號位就完成了。符號位出現在最前(左)面一位,0代表正數,1代表負數。
+3 -> 11 -> 根據符號和byte長度補全:0000 0011
-5 -> 101 -> 根據符號和byte長度補全:1000 0101
那么為什么會提出反碼和補碼的概念呢?有兩個原因:
1. 反碼
保證在二進制下能夠正常的進行正負數間的運算。
首先我們來看一下如果直接使用原碼存儲,在進行正負數運算的時候會出現什么樣的情況。5+(-3)=2,那么在二進制下的運算也和十進制一樣,直接相加,該進位進位,但是符號位沒法直接參與運算,換句話說,讓計算機直接判斷算式最后的正負其實比較困難。
原碼計算:0000 0011 + 1000 0101 = 1000 1000,結果是:-8(不需要糾結最后的符號位應該取什么,因為在計算機中并沒有采用這種方法進行計算,只是舉例)。顯然,直接采用原碼計算的這種方式在正數下是沒問題的,但是在負數時就不適用了,所以我們需要重新定義一個規則對負數進行處理。
由于在正數下計算是沒問題的,那么就可以規定:正數的反碼等于原碼,負數的反碼為除去符號位,其他取反。
+3 -> 原碼:0000 0011 -> 反碼:0000 0011
-5 -> 原碼:1000 0101 -> 反碼:1111 1010
反碼計算后:1111 1101 -> 原碼:1000 0010 -> 十進制:-2。嗯,好像沒什么問題了,但是當一個正數和一個負數的運算結果為正數(如:+5和-3,大家可以自己驗證)或者恰好為0時還是會有問題。
2. 補碼
+0和-0的沖突問題。
從相反數的概念我們可以知道,一個正數肯定存在一個與之對應的相反數,對于整數來說我們只要直接改變一下符號位就行了。But!這個0就很特殊,有一個耳熟能詳的概念:0的相反數還是0,這會直接導致進制的轉換不是一一對應的關系了。
+2 -> 原碼:0000 0010 -> 反碼:0000 0010
-2 -> 原碼:1000 0010 -> 反碼:1111 1101
反碼計算后:1111 1111 -> 原碼:1000 0000 -> 十進制:-0。結果貌似正確,但是在正數中:0000 0000也同樣代表0。那么對于1000 0000,是不能直接被抹去的,那就讓它來代表一個特殊的數字吧:-128。
其實,特殊的不只是這一個數字,如對于Java中的short,占用兩個字節,最高一位為符號位,那么就會出現這個數字:1000 0000 0000 0000,從原碼上看也是-0,對于int類型也是一樣,那么這個問題就可以總結為:符號位為1,其他位均為0,我們應該怎么處理。
于是,為了解決這一類問題,就有了補碼的概念:負數的補碼 = 反碼 + 1。我們用臨界位置的計算來進行舉例,如:(-2)+(-126)=-128。
-2 -> 原碼:1000 0010 -> 反碼:1111 1101 -> 補碼:1111 1110
-126 -> 原碼:1111 1110 -> 反碼:1000 0001 -> 補碼:1000 0010
補碼運算結果:1000 0000(該類數字沒有原碼和反碼)
到此我們該敲個黑板,劃個重點了:在內存中都是使用補碼來進行計算的(整數類型)!
三、byte的數據范圍
明確了上面幾個概念,那么byte的范圍應該就很清楚了。
最大的正數:0111 1111 -> 2^7 - 1 = 127
最大的負數:1000 0000 -> -2^7 = -128
對于其他正數類型的范圍也是如此:
Java中的short:2字節 -> -2^15 ~ 2^15 - 1
Java中的int:4字節 -> -2^31 ~ 2^31 - 1
Java中的long:8字節 -> -2^63 ~ 2^63 - 1
不同語言定義的數據類型在內存中占用的字節數是不同的,而且也不需要直接記這些范圍,一般來說記字節就好。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。