Java整數類型取值範圍計算
以下以3位做爲示例。
1,如果不考慮負數。3位表示的最高值爲111,轉爲10進製爲7,加上0,總共可表示8位數字。
2,如果考慮負數,則需要有一位來表示符號位。計算機規定最高位爲符號位,0表示正,1表示負。那最大值就變成了011,轉爲10進製爲3。最小負數爲111,轉爲10進製爲-3。則可表示的數只有7位。原因是000表示正0,100表示負0。0只要一個就可以了,這裏出現的問題是有兩個表示0的了
3,我們再來進行正數和負數的加法運算。
正數原碼: 負數原碼:
0: 000 -0: 100
1: 001 -1: 101
2: 010 -2: 110
3: 011 -3: 111
1 + -1 = 0 = 001 + 101 = 110 = -2
1 + -2 = -1 = 001 + 110 = 111 = -3
由於計算機沒有減法,採用的是將減法轉換成加法,減一個數等於加一個負數。爲了解決這個問題。引入反碼的概念。反碼就是正數的反碼與原碼一樣,負數的反碼符號位不變,其它位數取反值。原理相當於鐘錶,
比如9點我想調到7點。
逆時針調:9 - 2 = 7。
順時針調:9 + (12 - 2) = (19 - 12) = 7
9 + 2取反 = 結果取反。這裏不考慮負數。
正數原碼: 負數原碼: 負數反碼:
0: 000 -0: 100 -0: 111
1: 001 -1: 101 -1: 110
2: 010 -2: 110 -2: 101
3: 011 -3: 111 -3: 100
1 + -1 = 0 = 001 + 110 = 111 = -0
2 + -2 = 0 = 010 + 101 = 111 = -0
3 + -3 = 0 = 011 + 100 = 111 = -0
1 + -2 = -1 = 001 + 101 = 110 = -1
1 + -3 = -2 = 001 + 100 = 101 = -2
反碼解決了將減法變成加法的問題。
4,第二點中有兩個0的問題。
當兩個正數相加超出了最大值出現了下面的情況。
3 + 1 = 4 = 011 + 001 = 100 = -0
3 + 2 = 5 = 011 + 010 = 101 = -1
3 + 3 = 6 = 011 + 011 = 101 = -2
其結果像下圖中的鐘,超過3一位,就到了-0,超過2位就到了-1,超過3位到了-2
既然3 + 1 = 4 = 011 + 001 = 100 = -0,不考慮符號的情況是4,那爲何不把它當成-4。所以就規定100爲-4吧,這樣就不會浪費一位數了。
如果3後面是-4(超過3一位),
超過3兩位是-3,
超過3三爲是-2,
...
這樣才理想
應該如下圖:
如何把原來的-1變成-3,-2變成-2,-3變成1。
於是便有了補碼。在負數的補碼,在反碼的基礎上加1就得到了想要的結果。
正數原碼: 負數原碼: 負數反碼: 負數補碼
0: 000 -0: 100 -0: 111 -4: 1000
1: 001 -1: 101 -1: 110 -1: 111
2: 010 -2: 110 -2: 101 -2: 110
3: 011 -3: 111 -3: 100 -3: 101
3 + 1 = 4 = 011 + 001 = 100 = -4
3 + 2 = 5 = 011 + 010 = 101 = -3
3 + 3 = 6 = 011 + 011 = 110 = -2
Java的byte類型取值範圍計算
1,Java中的byte類型爲8位
2,正數最大值爲 01111111 = 0111111 + 1 = 100000000 - 1 = 2^8 - 1 = 127。
3,負數比正數多一位。 -2^8 - 1 + 1 = -2^8 = -127。
由此得出Java整數類型範圍計算爲
正數: 2^位數 - 1
負數: -2^位數
位
位:"位(bit)"是電子計算機中最小的數據單位。每一位的狀態只能是0或1。
原碼
原碼:是最簡單的機器數表示法。用最高位表示符號位,‘1’表示負號,‘0’表示正號。其他位存放該數的二進制的絕對值。
反碼
反碼:正數的反碼還是等於原碼,負數的反碼就是他的原碼除符號位外,按位取反。
補碼
補碼:正數的補碼與原碼一致,負數的補碼是該數的反碼加1。
Java八大基本數據類型
數據類型 |
位數 |
範圍(二進制) |
範圍(轉十進制) |
範圍(十進制) |
byte |
8 |
負數:11111111正數:01111111 |
負數:-2^7。正數:1000000 - 1 = 01111111 → 2^7 - 1 |
負數:-128。正數:127 |
short |
16 |
|
負數:-216。正數:216 - 1 |
負數:-32768。正數:32767 |
int |
32 |
|
負數:-232。正數:232 - 1 |
負數:-2147483648。正數:2147483647 |
long |
64 |
|
負數:-264。正數:264 - 1 |
負數:-9223372036854775808。正數:9223372036854775807 |
float |
32 |
|
負數:-232。正數:232 - 1 |
負數:1.4E-45 (2的-149次方)。正數:3.4028235E38 (2的128次方-1) |
double |
64 |
|
負數:-2^64 |
負數:4.9E-324 (2的-1074次方)。正數:1.7976931348623157E308 (2的1024次方-1) |
char |
16 |
|
正數:2^64 - 1 |
|
boolean |
|
|
|
|
注:E:在計算器中,數據較大時,用科學記數法表示,E後面數字表示10的次冪數。