基本數據類型轉換
- Java程序中要求參與的計算的數據,必須要保證數據類型的一致性,如果數據類型不一致將發生類型的轉換。java中數據類型轉換分爲自動類型轉換和強制類型轉換。
自動類型轉換
一個 int 類型變量和一個 byte 類型變量進行加法運算, 結果會是什麼數據類型?
public class Demo {
public static void main(String[] args) {
int a = 41;
byte b = 66;
// byte result = a + b; 錯誤,不能使用byte類型的數據接收結果
int result = a + b;
}
}
運算結果,變量的類型將是 int 類型,這就是出現了數據類型的自動類型轉換現象。byte 類型內存佔有1個字節,在和 int 類型運算時會提升爲 int 類型 ,自動補充3個字節,因此計算後的結果還是 int 類。同樣道理,當一個 int 類型變量和一個 double 變量運算時, int 類型將會自動提升爲 double 類型進行運算。數據之間的運算包括賦值,計算.....
概念:將 取值範圍小的類型 自動提升爲 取值範圍大的類型 就是自動類型轉換
特點:代碼不需要進行特殊處理,自動完成。
數據類型按容量大小排序爲:
- 有多種類型的數據混合運算時,系統首先自動將所有數據轉換成容量最大的那種數據類型,然後再進行計算。
- byte,short,char之間不會相互轉換,他們三者在計算時首先轉換爲int類型。
- boolean類型不能與其它數據類型運算。
舉例:
public class Demo01DataType {
public static void main(String[] args) {
byte b = 2;
short s = 129;
/*
byte b2 = b + s; 編譯不通過
byte,short,char之間不會相互轉換,他們三者在計算時首先轉換爲int類型。
int類型的數據不能直接賦值給byte類型的變量去接收
*/
int i = b + s;
System.out.println(i);//131
//int + short -->int 可以直接賦值給long類型的變量接收
long l = b + i;
System.out.println(l);//133
//int + short -->int 可以直接賦值給float類型的變量接收
float f = b + i;
System.out.println(f);//133.0
// short 賦值給double 符合自動類型轉換的條件
double d = s;
System.out.println(d);//129.0
char c = 'a';
// char + int --> int
int result = c + i;
System.out.println(result);//228
/*
左邊是float類型,右邊是long類型,左右不一樣
long類型賦值給float類型存儲,範圍是float更大一些,符合從小到大的規則
也發生了自動類型轉換
*/
float f1 = 30L;
System.out.println(f1); // 30.0
}
}
強制類型轉換
將 1.5 賦值到 int 類型變量會發生什麼?產生編譯失敗,肯定無法賦值
int i = 1.5; // 錯誤
double 類型內存8個字節, int 類型內存4個字節。 1.5 是 double 類型,取值範圍大於 int 。可以理解爲 double 是8升的水壺, int 是4升的水壺,不能把大水壺中的水直接放進小水壺去。想要賦值成功,只有通過強制類型轉換,將 double 類型強制轉換成 int 類型才能賦值。自動類型轉換的逆過程,將容量大的數據類型轉換爲容量小的數據類型。使 用時要加上強制轉換符:(),但可能造成精度降低或溢出,格外要注意。
- 概念:將 取值範圍大的類型 強制轉換成 取值範圍小的類型 。
- 格式:數據類型 變量名=(數據類型)被轉數據值;
- 特點:代碼需要進行特殊的格式處理,不能自動完成。
將 1.5 賦值到 int 類型要想成功就必須使用強制類型轉換,代碼修改爲:
// double類型數據強制轉成int類型,直接去掉小數點。
int i = (int)1.5;
同樣道理,當一個 short 類型與 1 相加,我們知道會類型提升,但是還想給結果賦值給short類型變量,就需要強制轉換。
注意事項:
- 強制類型轉換一般不推薦使用,因爲有可能發生精度損失、數據溢出。
-
boolean類型不可以轉換爲其它的數據類型。
舉例:
/*
1. 特點:代碼需要進行特殊的格式處理,不能自動完成。
2. 格式:範圍小的類型 範圍小的變量名 = (範圍小的類型) 原本範圍大的數據;
*/
public class Demo02DataType {
public static void main(String[] args) {
/* 左邊是int類型,右邊是long類型,不一樣
long 類型交給 int類型存儲,不是符合知道類型轉換的規則
不能發生自動類型轉換!要想編譯成功就必須使用強制類型轉換
格式:範圍小的類型 範圍小的變量名 = (範圍小的類型) 原本範圍大的數據;
*/
int num = (int) 100L;
System.out.println(num);//100
// long強制轉換成爲int類型,可能發生數據溢出。
int num2 = (int) 6000000000L;
System.out.println(num2); // 1705032704
// double 強制類型轉成爲 int,會發生精度損失。這並不是四捨五入,所有的小數位都會被捨棄掉
int num3 = (int) 3.99;
System.out.println(num3); // 3
/*
這是一個字符型變量,裏面是大寫字母A
計算機的底層會用一個數字(二進制)來代表字符A,就是65
一旦char類型進行了數學運算,那麼字符就會按照一定的規則翻譯成爲一個數字
*/
byte b1 = 40;
short s = 60;
/*
byte + short --> int + int --> int
數據範圍大的類型強制轉換爲數據範圍小的類型:
注意必須保證邏輯上真實大小本來就沒有超過short範圍,否則會發生數據溢出
*/
short result = (short) (b1 + s);
System.out.println(result); // 100
}
}
字符串類型:String
- String不是基本數據類型,屬於引用數據類型
- 使用方式與基本數據類型一致。例如:String str = “abcd”;
- 一個字符串可以串接另一個字符串,也可以直接串接其他類型的數據。
- 對於字符串String來說,加號代表字符串連接操作。任何數據類型和字符串進行連接的時候,結果都會變成字符串
- 通常,字符串不能直接轉換爲基本類型,但通過基本類型對應的包裝類則可 以實現把字符串轉換成基本類型。
舉例:
/*
String類型變量的使用
1. String屬於引用數據類型,翻譯爲:字符串
2. 聲明String類型變量時,使用一對""
3. String可以和8種基本數據類型變量做運算,且運算只能是連接運算:+ 運算的結果仍然是String類型
*/
class StringTest {
public static void main(String[] args) {
//練習1
char c = 'a';//97
int num = 10;
String str = "a";
System.out.println(c + num + str);//107a
System.out.println(c + str + num);//aa10
System.out.println(c + (num + str));//a10a
System.out.println((c + num) + str);//107a
System.out.println(str + num + c);//a10a
//練習2
//* *
System.out.println("* *");//* *
System.out.println('*' + '\t' + '*');//93
System.out.println('*' + "\t" + '*');//* *
System.out.println('*' + '\t' + "*");//51*
System.out.println('*' + ('\t' + "*"));//* *
String str1 = 123 + "";
System.out.println(str1);//"123"
//字符串轉換爲int類型
int num1 = Integer.parseInt(str1);
System.out.println(num1);//123
}
}
關於進制
所有數字在計算機底層都以二進制形式存在。
對於整數,有四種表示方式:
- 二進制(binary):0,1 ,滿2進1.以0b或0B開頭。
- 十進制(decimal):0-9 ,滿10進1。
- 八進制(octal):0-7 ,滿8進1. 以數字0開頭表示。
- 十六進制(hex):0-9及A-F,滿16進1. 以0x或0X開頭表示。此處的A-F不區分大小寫。 如:0x21AF +1= 0X21B0
package demo.binary;
class BinaryTest {
public static void main(String[] args) {
//二進制(binary):0,1 ,滿2進1.以0b或0B開頭。
int num1 = 0b110;
//十進制(decimal):0-9 ,滿10進1。
int num2 = 110;
//八進制(octal):0-7 ,滿8進1. 以數字0開頭表示。
int num3 = 0127;
//十六進制(hex):0-9及A-F,滿16進1. 以0x或0X開頭表示。此處的A-F不區分大小寫。
int num4 = 0x110A;
System.out.println("num1 = " + num1);//num1 = 6
System.out.println("num2 = " + num2);//num2 = 110
System.out.println("num3 = " + num3);//num3 = 87
System.out.println("num4 = " + num4);//num4 = 4362
}
}
二進制
- Java整數常量默認是int類型,當用二進制定義整數時,其第32位是符號位; 當是long類型時,二進制默認佔64位,第64位是符號位
二進制的整數有如下三種形式:
- 原碼:直接將一個數值換成二進制數。最高位是符號位
- 負數的反碼:是對原碼按位取反,只是最高位(符號位)確定爲1。
- 負數的補碼:其反碼加1。
計算機以二進制補碼的形式保存所有的整數。
正數的原碼、反碼、補碼都相同
負數的補碼是其反碼+1
爲什麼要使用原碼、反碼、補碼錶示形式呢?
- 計算機辨別“符號位”顯然會讓計算機的基礎電路設計變得十分複雜! 於是 人們想出了將符號位也參與運算的方法. 我們知道, 根據運算法則減去一個正 數等於加上一個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有 減法, 這樣計算機運算的設計就更簡單了。
- 對於正數來講:原碼、反碼、補碼是相同的:三碼合一。
- 計算機底層都是使用二進制表示的數值
- 計算機底層都是使用的數值的補碼保存數據的。