● boolean類型不可以轉換成其他的資料類型;
● 整形、字元型、浮點型的資料在混合運算中相互轉換,轉換時遵循如下規則:
■ 容量小的類型自動轉換成容量大的資料類型;資料類型按容量大小排序如下: byte,short,charàintàlongàfloatàdouble
要注意的是byte,short,char之間不會相互轉換,他們三者在計算時首先轉換 為int類型。byte的取值範圍是-128~127
n 容量大的資料類型轉換為容量小的資料類型時,要加上強制轉換符,但可能造成精
度降低或者溢出;使用時候要格外注意。
n 有多種類型的資料混合運算時,系統首先自動地將所有類型轉換成容量最大的那個
資料類型,然後再進行計算。
● 實數常量(如:1.2)預設為double。(故:float f = 22.2;是錯誤的)
● 整數類型(如:123)預設為int。
● 可以直接把一個int類型的數賦值給一個byte,short,char類型的變數,但是不能超過其對應的範圍(直接截取最後的一個位元組)。
● 要理解容量大的數強制轉換成容量小的數的實質是截取後面的位元組(如:int類型轉換成double類型的時候,是直接取int類型中4個位元組的最後一個位元組),但是double轉換成float類型,由於double中存在小數點的情況,因此直接加強制轉換時轉換不過來的(infinity)。
● long類型8個位元組,int類型4個位元組,short類型2個位元組,byte類型1個位元組。
Float類型4個位元組,double類型8個位元組。
l 典型問題:
(1) double d = 1e200;//列印顯示Infinity;
(2) float f = 11.1//錯誤;預設為double類型,應該修改為float f = 11.1f;
(3)
)public class TestDataKind { public static void main(String[] args) { byte b = 44; char c = 'b'; short s = 1024; int i = 40000; long l = 12463l; float f = 35.67f; double d = 3.1234d; /* * (f * b)時,b自動提升為float類型 (l*f)時,l自動提升為float類型 (i/c)*時,c自動提升為int類型 * (d*s)時,s自動提升為double類型 再相加時,中間結果都變為了double類型。 * 這裡result只能聲明為double類型,result聲明為其他類型會出錯,除非進行*強制類型轉換 */ double result = (f * b) + (l * f) + (i / c) - (d * s); System.out.print((f * b) + " + " + (l * f) + " + " + (i /c) + " - " + (d * s)); System.out.println(" = " + result); }}
(4) byte b1 = (byte)128;
byte b2 =(byte)-129;
System.out.println(b1);
System.out.println(b2);
列印結果:-128和127
分析:byte只有八位,只能表示-128—127;電腦中負數的儲存方式是補碼。對負數的絕對值的二進位值取反,再加一,即為負數的二進位碼。如:-1的絕對值1的二進位碼為00000001,取反得到11111110,再加一為11111111。-128的絕對值128的二進位碼為10000000,取反得到01111111,再加一為10000000,正好是Byte的最大表示範圍。而-129的絕對值129的二進位碼為10000001,取反後得01111110,加一後得01111111,最後結果就是127