1. 程式人生 > >Java 數據類型の理解

Java 數據類型の理解

highlight 理解 說明 轉換 既然 執行過程 基礎 fff key

1、數據類型分為內置類型和引用類型,等等基礎概念,不再詳細闡述,很多博客上面有進行介紹。

2、Something About Integer

Java (JVM)中看到不帶小數點的數(即整數),則默認將該值分為int 類型。若需存儲足夠大的整數,=> long number = 88888888L ;

Q1:byte 所占為1 btye = 8 bit , 為毛其是範圍:-2的7次方~2的7次方-1(1111,1111~0111,1111),即-128~127?

A1:整數為帶符號的數,最高位在0、1代碼中表示符號位 (0正1負),余下7位來根據十進制=>二進制關系,來存放該數的絕對值。

Q2:既然所有整數視為int ,為毛還需引入不同的數據類型?

A2:例如,byte類型雖然在語義(邏輯)上是占用1字節,但實際上,JVM中是將其當做int的,也就是事實上是占用了32位,4字節的,所以其運算效率和int沒區別,short也一樣。

之所以要有byte/short類型,一是因為某些地方要明確使用這些範圍類型(個人理解為給人看的,而非給機器聲明,因為機器為默認分配4 byte.)。二是,byte[]數組中,JVM存儲的則是真的1字節,short[]2字節。(但也有的JVM其byte[]數組也是4字節1位)

Q3:十進制、八進制、十六進制整數區別?

A3:對於同一個數(10),三者(十進制:10,十六進制:A,八進制:12)在內存中都是0、1代碼,只不過是根據其進制對應法則,展示的效果不同而已。默認int a= 10 ,是按十進制格式輸入輸出。也可以輸出八進制 int a =012 (數字前面加0,表示八進制格式) 、十六進制 int b =0xA(對應數字前加0x 或者 0X,表示十六進制格式)。

Q4:

char b = ‘a‘ + 18;   

char a = ‘a‘ ;    
char b = a + 18;     

  

前者語句不報錯,後者語句報錯:錯誤:不兼容的類型。為毛?

A4:關於第一句 字符常量‘a‘ 使用Unicode , 實際存儲是轉換為整數特定值來代表該字符,整數之間可以進行運算,將運算完的結果再轉換為char 對應字符輸出。(邏輯上可以這樣理解)

  第一句的,其他理解是:javac在編譯的時候就直接把 char b = ‘a‘ + 18 編譯成 char b = ‘s‘ 了 。   (p.s.兩種理解方式,本人未學過匯編,具體機器執行過程不清楚,第二種更準確更深入。)

  關於第二句:a 是變量,jvm不知道具體的a是多少,所以進行算數運算的時候,會自動把char類型的‘a‘轉為int類型的97,然後在進行算數運算,之後就需要強轉為char了。

  若需解決第二局的錯誤,進行強制類型轉換。

char a = ‘a‘ ;

char b = (char)(a+18);

3、 具體例子說明

1)   long number = 0xfffffffffff;//0x表示這個數是16進制數,0表示8進制。     //編譯器報錯,因為右邊默認是int,但其超出了範圍(沒超出int範圍的話     //編譯器會隱式將int轉為long),故報錯(同樣的錯誤也會出現在float)。 聲明類型是獲取內存中對應類型的字節,來存儲輸入數。若要解決問題,在等式右邊最後加上L。顯式提示為long類型。 2)   short s = 123;//(這個123也是int類型,這裏,= 操作編譯器能隱式轉換)     s = s + 123;//編譯器報錯,那是因為s+123是int類型(編譯器先將s轉化為int,再+123),+ 運算符等算數運算符,遇到不同類型的會自動轉換。     //這裏,+ 操作編譯器不能隱式轉換(會提示失真,即精度可能會受損)。正確的做法:     s = (short)(s + 123)//註意,不是(short)s + 123。

Java 數據類型の理解