1. 程式人生 > >Java開發筆記(五)數值變數的型別

Java開發筆記(五)數值變數的型別

如今個人電腦的配置越來越高,記憶體和硬碟的容量大小都是以G為單位,而1G=1024M=10241024K=102410241024位元組。不過在PC的早期發展階段,電腦的儲存空間卻是十分有限的,像2000年前後廣泛使用的3.5寸軟盤,其儲存容量只有區區1.44M,當時流行的SDR記憶體容量也才32M和64M。所以早期的程式語言很注重節約儲存,給每個變數分配記憶體都要精打細算,大環境如此,於是早在1996年誕生的Java語言也不例外,僅僅是處理整數和小數,就分成了byte、short、int、long、float、double六種數字型別。下面簡要介紹一下這六種型別的數值表示範圍。
byte:位元組型。該型別的變數只佔用一個位元組大小,一個位元組可表達八位的二進位制數,因為八位的第一位是符號位,為0時表示當前是正數,為1時表示當前是負數,所以byte型別實際囊括的數值範圍是-128到127。其中00000000到01111111表示了0到127區間,而10000000到11111111表示了-128到-1區間。需要注意的是,Java使用補碼錶示二進位制數,且正數的補碼與其原碼相同,但負數的補碼是在其反碼的末位加1(負數的反碼是正數)。因此假設某負數為x,若令“x取反+1=10000000”,則求得“x=(10000000-1)再取反=01111111取反=10000000”,即x=-128;若令“x取反+1=11111111”,則求得“x=(11111111-1)再取反=11111110取反=00000001”,即x=-1。
short:短整型。該型別的變數佔用兩個位元組大小,可表達的數值範圍是-32768到32767,即負2的15次方~2的15次方-1。
int:整型。該型別的變數佔用四個位元組大小,可表達的數值範圍是-2147483648到2147483647,即負2的31次方~2的31次方-1。
long:長整型。該型別的變數佔用八個位元組大小,可表達的數值範圍是-9223372036854775807到9223372036854775808,即負2的63次方~2的63次方-1。
float:浮點型,用來表示小數。該型別的變數佔用四個位元組大小,它包括一個符號位、一個8位的指數和一個23位尾數,此時1+8+23=32位=4位元組。浮點數的計算公式為:正/負

(2的指數次方)*尾數,其中正/負由符號位決定,8位指數的表示範圍是-128到127,尾數表示一個介於1.0和2.0之間的小數。這樣float型別可表示的整數部分範圍橫跨正負3.402823乘以10的38次方,小數部分範圍低至1.401298乘以10的負45次方,雖然看起來浮點數的表示位數大大增加,但是有效數字只有6到7位,也就是說,開頭6到7位才是精確的數字,後面的數字統統不準。
double:雙精度型,用來表示小數。該型別的變數佔用八個位元組大小,它包括一個符號位、一個11位的指數和一個52位尾數,此時1+11+52=64位=8位元組。double型別可表示的整數部分範圍橫跨正負1.797693乘以10的308次方,小數部分範圍低至4.9000000乘以10的負324次方,並且有效數字提高到了15到16位。跟double雙精度相比,float型別的有效位數明顯不夠,於是浮點數也被稱作單精度數。

對於實際開發來說,byte和short型別可表達的整數範圍太小,同時現在電腦的儲存容量毫不在乎幾個位元組的差異,因此這兩個型別在Java程式設計中基本無用武之地。int型別可以表示高達21億的整數,能夠應付大部分的整數運算場景,故而Java編碼中的整數變數最常使用int型別。至於long型別可表示多達19位的十進位制數,常用於int型別覆蓋不到的整數場合,比如世界人口數量80億必須通過long型別來儲存。小數計算方面,因為float型別的數字精度不夠準,所以小數變數更常使用double型別來處理。
有了這些基本的數值型別,就能宣告相應型別的變量了,宣告語句的格式為“變數型別 變數名稱;”。如果在宣告變數之時就進行初始賦值,則宣告語句的格式為“變數型別 變數名稱 = 具體的數值;”。下面是個宣告數值變數的程式碼例子,其中包含了先宣告再賦值、以及宣告時即刻賦值的兩種情況:

public class Basic {
	
	public static void main(String[] args) {
		int zhumulanma; // 先宣告變數
		// 8844是2005年中國測量得到的珠穆朗瑪峰巖面高度,8848是冰雪高度
		zhumulanma = 8844; // 再對變數賦值
		System.out.println("珠穆朗瑪峰的高度="+zhumulanma);
		double yuanzhoulv = 3.1415926; // 在宣告變數之時就進行初始賦值
		System.out.println("圓周率="+yuanzhoulv);
	}
}