Java整數類型取值範圍計算

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的次冪數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章