標籤:stat tcl getc 之間 層級 說明 資料 a+b e30
資料類型範圍測試
一、數字常數的編譯問題
java中的常量數字預設以int型編譯
如:
long a = 1234567890; //十位long b = 12345678900; //預設資料為int型,十一位超int範圍,編譯不過,在eclipse下數字有底線提醒
如果用到的數超過int型,這裡提供一下幾種解決方案
1.整數後面加L或者l
long c = 12345678900L; //加L或者l表示以long編譯
2.寫成浮點數形式(double表示的範圍更廣)
在java中,直接寫整數常數,被預設為int型,整數後面加L可以轉化成long型。
直接寫浮點常數,被預設為double型,整數後面加f可以轉化成float型。
double e = 12345678900.0; //以double形式寫數字常量,編譯可過
二、unsigned int的處理方法
java沒有unsigned int類型,筆者使用了移位的方法表示了無符號整型的最大值
private static final long UNSIGNED_INT_MAX = (1L << 32) - 1;
順便一提,可以用這種方法定義常量字元,代替C語言的宏定義。
基礎資料型別 (Elementary Data Type)介紹
基礎資料型別 (Elementary Data Type)主要有這幾個:
byte、short、int、long、float、double、char、boolean
可以分為三類:
- 數實值型別:byte、short、int、long、float、double
- 字元類型:char
- 布爾型:boolean
byte
- byte是8位的資料類型,佔用1個位元組(8bit),預設值是0,它的取值範圍是(-2^7) ~ (2^7-1),也就是 -128 ~ 127之間,所以最大儲存資料量是255;
- byte一般在大型數組中使用,來代替整數,因為byte變數佔用的空間只有int的1/4。
- byte使用樣本: byte a = 10,byte=-10。在使用byte資料類型的時候需要注意取值範圍!!!
short
- short是16位的資料類型,佔用2個位元組,預設值是0,它的取值範圍是(-2^15) ~(2^15-1),也就是 -32768 ~ 32767之間,所以最大資料存放區量是65536;
- short雖然是int型變數所佔空間的1/2,但是在實際中卻很少用到。在大型數組中也可以節省空間的。
- short使用樣本:short a=100,short b=-200;
int
- int是32位的資料類型,佔用4個位元組,預設值是0,它的取值範圍是(-2^31) ~(2^31-1),也就是 -2147483648 ~ 2147483647之間,所以最大資料存放區量是2^32-1;
- int是資料類型是整型,是我們在項目中用到最多的資料類型之一;
- int 使用樣本:int a=1000,int b=-2000;
long
- long是64位的資料類型,佔用8個位元組,預設值是0L,它的取值範圍是(-2^63) ~(2^63-1),也就是 -9223372036854775808 ~ 9223372036854775808之間,所以最大資料存放區量是2^64;
- long是資料類型是長整型,是我們在項目中用到最多的資料類型之一。在使用long類型的資料時最好在數值末尾帶上大寫的L!
- long 使用樣本:long a=1000L,long b=-2000L;
float
- float是32位的資料類型,佔用4個位元組,預設值是0,它的取值範圍是3.4e-45 ~ 1.4e38 之間;
- float是資料類型是單精確度,在直接賦值時必須在數字後加上f或F。
- float使用樣本:float a=10.25f, float b=-20.35F;
double
- double是64位的資料類型,佔用8個位元組,預設值是0,它的取值範圍是4.9e-324 ~ 1.8e308 之間;
- double是資料類型是雙精確度,在直接賦值的時候最好加上D或d。
- double使用樣本:double a=10.123d, double b= -10.25644D;
boolean
- boolean是布爾類型,佔用1個位元組,只有兩個值,false和true,預設值是 false。
- boolean只能用一種標誌來記錄 true或false,一般和 if 結合使用。
- boolean使用樣本: boolean a=true,boolean b=false;
char
- char是字元類型,佔用2個位元組,預設值為空白,取值範圍 為 0~65535,也就是 \u0000 ~ \uffff。
- char資料類型可以儲存任何字元。
- char 使用樣本: char a=1,char b=’A’;
數實值型別的層級從低到高分別為:
byte,char,short(這三個平級)——>int——>float——>long——>double
其中由低層級轉到進階別,是屬於自動類型轉換,這點是由系統自動轉換的。
例如將int類型的資料轉為float類型的資料。
樣本:
int i=10;float j=i;System.out.println("i:"+i+",j:"+j);
結果:
i:10,j:10.0
如果由進階別轉為低層級,則需要強制轉換,也就是強制類型轉換。
例如將int類型的資料轉換為byte類型的資料。
樣本:
int i=127;int j=128;byte bye=(byte)i;byte bye2=(byte)j;System.out.println("i:"+i+",bye:"+bye);System.out.println("j:"+j+",bye2:"+bye2);
結果:
i:127,bye:127j:128,bye2:-128
說明:因為 byte 類型是 8 位,最大值為127,所以當 int 強制轉換為 byte 類型時,值 128 時候就會導致溢出。所以在進行強制類型轉換的時候,要注意取值範圍!
在強制轉換的時候需要注意資料的精確度,否則可能會出現資料精確丟失。
例如 double類型的資料轉換為float類型資料。
樣本:
double d=10.1111115;float f=(float) d;System.out.println("f:"+f+",d:"+d);
結果:
f:10.111112,d:10.1111115
瞭解了資料類型的層級之後,如果用不同的資料類型進行計算,那麼最終的資料類型又是哪一種呢?
這裡我們用這幾種來測試:
1.byte 類型的資料 加 short 類型的資料;
2.short 類型的資料 加 int 類型的資料;
3.int 類型的資料 加 long 類型的資料;
這裡我們使用這個方法來擷取最終的資料類型
public static String getType(Object o){ return o.getClass().toString();
代碼:
short a=1;byte b=2;int c = 3;long d = 4;System.out.println(getType(a));System.out.println(getType(b));System.out.println(getType(c));System.out.println(getType(d));System.out.println(getType(a+b));System.out.println(getType(a+c));System.out.println(getType(c+d));
結果:
class java.lang.Shortclass java.lang.Byteclass java.lang.Integerclass java.lang.Longclass java.lang.Integerclass java.lang.Integerclass java.lang.Long
看到結果是不是有點吃驚呢?那麼是為什麼呢?
這裡的不同的數實值型別資料進行相加的時候,會自動轉換為層級最高的那一個。
那麼short 類型的資料加 byte 類型的資料為什麼是int類型呢?
因為在java的世界裡,如果比int類型小的類型做運算,java在編譯的時候就會將它們統一強轉成int類型。
如果上述不好理解的,那麼這裡我們來做個實驗測試下,通過結果來進行驗證。
樣本:
short a=1,b=2;byte c=3,d=4;System.out.println(getType(a+b));System.out.println(getType(c+d));
結果:
class java.lang.Integerclass java.lang.Integer
那麼這裡可以得出結論,在數實值型別中,若層級小於int,進行計算的時候,最終的資料類型會自動轉換為int,如果高於int,最終資料結果會取其中最高的一個!
java資料類型範圍