標題:

Java中數字的自動轉型?

發問:

 

此文章來自奇摩知識+如有不便請留言告知

class GFC100{ public static void main(String[] args){ final short s1 = 1; //1 final char c1 = 1; //2 byte b1 = s1; //3 byte b2 = c1; //4 byte b3 = 1; //5 byte b4 = 1L; //6 byte... 顯示更多 class GFC100{ public static void main(String[] args){ final short s1 = 1; //1 final char c1 = 1; //2 byte b1 = s1; //3 byte b2 = c1; //4 byte b3 = 1; //5 byte b4 = 1L; //6 byte b5 = 1.0; //7 byte b6 = 1.0d; //8 } } 我想知道3、4、5為什麼可以通過編譯 而6、7、8為什麼不行?

最佳解答:

首先,在編譯時會對原始資料型態 (Primitive Type) 做大小的檢測,其標準如下: 原始資料型態 大小 最小值 最大值 char 16-bit Unicode 0 Unicode 216-1 byte 8-bit -128 +127 short 16-bit -215 (-32,768) +215-1 (32,767) int 32-bit -231 (-2,147,483,648) +231-1 (2,147,483,647) long 64-bit -263 (-9,223,372,036,854,775,808) +263-1 (9,223,372,036,854,775,807) float 32-bit 32-bit IEEE 754 floating-point numbers double 64-bit 64-bit IEEE 754 floating-point numbers boolean 1-bit true or false 以第 6 行 byte b4 = 1L; 為例,等號的左邊為 byte (8位元),而右邊為 long (64位元),將一個 64 位元大小的資料塞到 8 位元的空間會造成精準度的問題,因此在編譯時會有錯誤發生。同理可用於第 7、8 行。 第 5 行的等號右邊沒有指定是何種整數,因此會根據等號左邊的大小來試,由於 1 是在 byte 的大小範圍內,所以此行是合法的。若改為 byte b3 = 1000; 則會有編譯錯誤發生。 至於第 3、4 行,則是由於 s1 及 c1 為固定的常數 (final),故在編譯時會按照第 5 行的原則來做檢測。在這裡的情況來說,該兩參數都沒有超過 byte 的範圍,所以沒有編譯錯誤發生。

其他解答:6524A8F25B63629D
arrow
arrow

    fksnlix 發表在 痞客邦 留言(0) 人氣()