Java 數據類型の理解
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 數據類型の理解