一、基本數據類型
Java語言提供了八種基本類型。六種數值類型(四個整數型,兩個浮點型),一種字符類型,還有一種布爾型。
java中基本數據類型中沒有無符號類型(C、C++中有),只有有符號類型。
在計算機內,定點數有3種表示法:原碼、反碼和補碼
原碼 :二進制定點表示法,即最高位為符號位,“0”表示正,“1”表示負,其余位表示數值的大小。
反碼 :正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼 :正數的補碼與其原碼相同;負數的補碼是將其原碼的除符號位外的所有位,逐位取反,然后加1。
計算機中數據的運算都是通過補碼進行的。
反碼是為了解決減法運算,補碼是為了解決反碼產生的±0的問題。
計算機中負數是用補碼的形式保存、並用它參與加減法運算的,減法會被轉換為加法,計算機中沒有減法運算。
在計算機中減法運算可以轉換成加法運算,比如8-1 --> 8+(-1) = 7
- 原碼:
8: 0000 1000
-1: 1000 0001
- 反碼:
8: 0000 1000
-1: 1111 1110
- 補碼:
8: 0000 1000
-1: 1111 1111
- 補碼運算:
(0000 1000) + (11111111) = 0000 0111 --> 4+2+1=7
比如:-128+127 --> 127+(-128) = -1
0111 1111 + (1000 0000) = 1111 1111(補碼) --> 1111 1110(反碼) --> 1000 0001(原碼) --> -1
計算機都是以補碼來存儲的:
⑴一個數為正,則它的原碼、反碼、補碼相同。
⑵一個數為負,則符號位為1,其余各位是對原碼取反(符號位不變),然后整個數加1。
先用一個正數1舉例
原碼:0000 0001
反碼:0000 0001
補碼:0000 0001
正數的原碼=反碼=補碼
對於-1來說
原碼:1000 0001
反碼:1111 1110(符號位不變,其他相反)
補碼:1111 1111(補碼是反碼+1)
Java中用補碼表示二進制數。
1、數值類型
(1)byte
-
-
byte數據類型是8位、有符號的,以二進制補碼表示的整數;(1字節 = 8位 ) Java中正數用源碼表示,負數用補碼表示,第一位是符號位。
-
最小值是 -128(-2^7);
-
最大值是 127(2^7-1)
-
參考鏈接:
+0的原碼是0000 0000
-0的原碼是1000 0000
實際上,”+0“和“-0”的原碼統一為0000 0000
1000 0000沒有使用(避免浪費),所以就將其分給了最小的負數 -128。
-
-
默認值是0;
- byte類型用在大型數組中節約空間,主要代替整數,因為byte變量占用的空間只有int類型的四分之一;
-
public class Test12 { public static void main(String[] args) { byte a = 127; System.out.println(a); //127 } }
相關面試題: 鏈接來源:
Java面試題 :byte a = (byte)128; 定義變量語句是否正確
public class Test12 {
public static void main(String[] args) {
byte a = (byte) 128;
System.out.println(a);
}
}
正確
1. 首先,分析基本數據類型
-
-
只寫128,說明128是整型(int類型)
-
128L 或128F 等等,說明是long類型(L),單精度浮點類型(F)
-
(byte)128中128是整型(int),只不過是強制類型轉換為了 字節類型(byte)
-
2、byte b = (byte)128; 只出現了 字節類型(byte)和整型(int),對兩者具體分析
-
-
整型(int)在內存中占32位(4字節)
-
字節類型(byte)在內存中占8位
-
所以,經過強制類型轉換,把int類型轉化為byte類型,byte只保存了int類型的低8位,其它位都舍棄
-
有符號類型,最高位都是符號位, 1表示負數, 0表示正數
-
- 如下圖解釋:
-
3. 分析128
用-0的二進制補碼表示到了 -128里面。
public class Test12 { public static void main(String[] args) { byte a = (byte) 128; System.out.println(a); //-0 --> -128
int類型:
原碼:0000 0000 0000 0000 0000 0000 1000 0000
反碼:0000 0000 0000 0000 0000 0000 1000 0000
補碼:0000 0000 0000 0000 0000 0000 1000 0000
byte類型截取后8位,即:
原碼:1000 0000(最高位為1,表示負數)
反碼:1111 1111
補碼:1000 0000(在補碼的過程中,符號位不能改變),1000 0000表示的是最小值,所以是-128,這叫上溢。

byte b = (byte) 129; System.out.println(b); //-127
int類型:
原碼:0000 0000 0000 0000 0000 0000 1000 0001
反碼:0000 0000 0000 0000 0000 0000 1000 0001
補碼:0000 0000 0000 0000 0000 0000 1000 0001
byte類型:
原碼:1000 0001
反碼:1111 1110
補碼:1111 1111(也就是-127)

byte c = -128; System.out.println(c); //-128 byte d = (byte) (-129); System.out.println(d); //127
int類型存儲
原碼:1000 0000 0000 0000 0000 0000 1000 0001
反碼:1111 1111 1111 1111 1111 1111 0111 1110
補碼:1111 1111 1111 1111 1111 1111 0111 1111
byte類型
原碼:0111 1111
反碼:0111 1111
補碼:0111 1111(值是127)

}
}
byte: -128 ~ 127
-
對於整數超出取值范圍時:
1、首先要計算出數據的二進制
2、做截取操作,截成byte類型(取低8位)
3、截取8位后,求補碼
(2)short
-
-
short數據類型是16位、有符號的以二進制補碼表示的整數。(2字節)
-
最小值是 -32768(-2^15);
-
最大值是 32767(2^15 - 1);
-
-
-
Short數據類型也可以像byte那樣節省空間。一個short變量是int型變量所占空間的二分之一;
-
默認值是0;
-
public class Test12 { public static void main(String[] args) { short s = 1000; System.out.println(s); //1000 short r = -20000; System.out.println(r); //-20000 } }
(3)int
-
-
int數據類型是32位、有符號的以二進制補碼表示的整數;(4字節)
-
最小值是 -2147483648(-2^31);
-
最大值是 2147483647(2^31 - 1);
-
-
-
一般地整型變量默認為int類型;
-
默認值是0;
-
(4)long
-
-
long數據類型是64位、有符號的以二進制補碼表示的整數;(8字節)
-
最小值是 -9223372036854775808(-2^63);
-
最大值是 9223372036854775807(2^63 -1);
-
這種類型主要使用在需要比較大整數的系統上;
- 默認值是0L;
-
(5)float
-
-
float數據類型是單精度、32位、符合IEEE 754標准的浮點數;(4字節)
-
float在儲存大型浮點數組的時候可節省內存空間;
-
默認值是0.0f;
-
浮點數不能用來表示精確的值,如貨幣;
-
例子:float f1 = 234.5f。
-
(6)double
-
-
double數據類型是雙精度、64位、符合IEEE 754標准的浮點數;(8字節)
-
浮點數的默認類型為double類型;
-
double類型同樣不能表示精確的值,如貨幣;
-
默認值是0.0d;
-
例子:double d1 = 123.4。
-
2、字符類型
(1)char
-
-
char類型是一個單一的16位Unicode字符;(2字節)
-
最小值是’\u0000’(即為0);
-
最大值是’\uffff’(即為65,535); 2的16次方 -1 (2^16 -1)
-
char數據類型可以儲存任何字符;
-
例子:char letter = ‘A’。
-
public class Test12 { public static void main(String[] args) { System.out.println(Character.SIZE); //16 // 以數值形式而不是字符形式將Character.MAX_VALUE輸出到控制台 System.out.println((int)Character.MAX_VALUE); //65535 System.out.println((int)Character.MIN_VALUE); //0 } }
3、布爾類型
(1)boolean
-
-
boolean數據類型表示一位的信息;
-
只有兩個取值:true和false;
-
這種類型只作為一種標志來記錄true/false情況;
-
默認值是false;
-
例子:boolean one = true。
-