Java中的基礎類型有:byte、short、int、long、float、double、char和boolean。
它們可被分為四種類型,整型、浮點型、char型和boolean型。
整型:byte、short、int、long 分別佔用1、2、4、8個位元組的空間;
浮點型:long、float 分別佔用4、8個位元組;
char型:char 佔用2個位元組;
boolean型:boolean 佔用1位。
在Java中不能直接使用二進位表示數字,可以使用8進位或者16進位來間接表示。這些數字類型在電腦中是如何表示的哪?通過下面的代碼大家可以看個大概,具體為什麼會這樣大家可以看看我部落格上“電腦中如何表示數字”的那幾篇文章,其實這段代碼主要是為了配合那幾篇文章而來的。
至於char型在後面要單獨介紹,因為Java中的char型是很獨特的,它會佔用兩個位元組的空間。boolean就用不著介紹了,但要記住和c不同,Java中的boolean型和整數沒有關係,它們之間無法進行轉換。
public class PrimitiveType {
public static void main(String[] args){
//java中整型數計算採用補碼,可以通過十六進位或者八進位形式對整型數直接賦值,java中不能
//直接使用位元
//byte
byte maxByte=0x7f;
System.out.println("最大byte:0x7f 真值:"+maxByte);
byte minByte=(byte) 0x80;
System.out.println("最小byte:0x80 真值:"+minByte);
//short
short maxShort=0x7fff;
System.out.println("最大short:0x7fff 真值:"+maxShort);
short minShort=(short) 0x8000;
System.out.println("最小short:0x8000 真值:"+minShort);
//int
int maxInt=0x7fffffff;
System.out.println("最大int:0x7fffffff 真值:"+maxInt);
int minInt=0x80000000;
System.out.println("最小int:0x80000000 真值:"+minInt);
//long
System.out.println("最大long:0x7fffffffffffffff 真值:"+
Long.decode("0x7fffffffffffffff"));
System.out.println("最小long:0x8000000000000000 真值:"+
Long.decode("-0x8000000000000000"));
//算是一個bug吧,補碼錶示已經是帶符號的數字了
//java中對小數直接量預設為double類型,定義float型需要在小數後面加上字母F,大小寫不限
float f=0.1F;
double d=0.1D;//定義double,在小數後面也可以加D,大小寫不限
//---------------------Java中浮點數計算都遵循IEEE754規範-------------------------//
//與整型數不同,浮點數在java中無法直接通過十六進位或者八進位形式定義
//最大正數(0 11111110 11111111111111111111111)=(0x7f7fffff)
float maxPositiveNumber=Float.intBitsToFloat(0x7f7fffff);
System.out.println("最大正單精確度浮點數:0x7f7fffff 真值:"+maxPositiveNumber);
//最小正數(0 00000001 00000000000000000000000)=(0x00800000)
float minPositiveNumber=Float.intBitsToFloat(0x00800000);
System.out.println("最小正單精確度浮點數:0x00800000 真值:"+minPositiveNumber);
//0,IEEE754 規定 E=0 M=0,則值為0,(0 00000000 00000000000000000000000)=(0x00000000)
float positoveZero=Float.intBitsToFloat(0x00000000);
System.out.println("正零:"+positoveZero);
float negativeZero=Float.intBitsToFloat(0x80000000);
System.out.println("負零:"+negativeZero);
//最大負數(1 00000001 00000000000000000000000)=(0x80800000)
float maxNegativeNumber=Float.intBitsToFloat(0x80800000);
System.out.println("最大負單精確度浮點數:0x80800000 真值:"+maxNegativeNumber);
//最小負數(1 11111110 11111111111111111111111)=(0xff7fffff)
float minNegativeNumber=Float.intBitsToFloat(0xff7fffff);
System.out.println("最小負單精確度浮點數:0xff7fffff 真值:"+minNegativeNumber);
//NaN,非數值,JDK API doc 上面也有提到
System.out.println("NaN:E=255 M0 例如:0x3f800001 運行結果:"+
Float.intBitsToFloat(0x7f800001));
//POSITIVE_INFINITY,正無窮大
System.out.println("POSITIVE_INFINITY:S=0 E=255 M=0 0x7f800000 運行結果:"+
Float.intBitsToFloat(0x7f800000));
//NEGATIVE_INFINITY,負無窮大
System.out.println("NEGATIVE_INFINITY:S=0 E=255 M=0 0xff800000 運行結果:"+
Float.intBitsToFloat(0xff800000));
//雙精確度浮點數同理可得
//下面對char型進行討論
char[] codeUnits;
//基本多語言層級 basic multilingual plane
//ASC2 code
for(int i = 0 ; i codeUnits = Character.toChars(i);
if( codeUnits.length == 1 ){
System.out.println(i+" "+(char)i);
}
}
//漢字 '嚴'
char yan = '/u4e25';
codeUnits = Character.toChars(0x4e25);
System.out.printf("漢字:"+yan+" 代碼點所佔代碼單元長度"+codeUnits.length+
" (0x%x) ,它屬於基本多語言層級。/n",(int)codeUnits[0]);
//輔助字元 supplementary character
//代碼點0x1d56b
codeUnits = Character.toChars(0x1d56b);
//判斷代碼單元的高低位
System.out.printf("代碼點0x%x 在UTF-16表示中被分解為兩個代碼單元 0x%x 0x%x /n",
0x105600,(int)codeUnits[0],(int)codeUnits[1]);
System.out.printf("0x%x is HighSurrogate:"+Character.isHighSurrogate(codeUnits[0])+
"/n",(int)codeUnits[0]);
System.out.printf("0x%x is HighSurrogate:"+Character.isHighSurrogate(codeUnits[1])+
"/n",(int)codeUnits[1]);
System.out.printf("0x%x is LowSurrogate:"+Character.isLowSurrogate(codeUnits[0])+"/n",
(int)codeUnits[0]);
System.out.printf("0x%x is LowSurrogate:"+Character.isLowSurrogate(codeUnits[1])+"/n",
(int)codeUnits[1]);
}
}