基本數據類型有四類八種,相互之間有著包含與被包含的關係。
比如9,它既可以是字節型,也可以是短整型,也可以是整型,長整型,甚至還可以是一個字符。
那他們之間是如何轉化的呢?
一、自動轉換
看下面例子:
2和2.0,在我們的認知中,可能就覺得它們其實就是一回事,但是在Java世界裡,它們對應不同的數據類型。
2這個常數默認是int類型的,當它賦值給一個double類型的時候,輸出時就會自動轉換。
代碼執行過程中取值範圍小的類型自動轉換為取值範圍大的類型
其中大小範圍如下:
<code>byte、short、char < int < long < float < double/<code>
再看一個例子:
1,它既可以是byte、也可以是short、char、int、long,但是在運算時會自動轉換成int。
所以:b1+b2=2(這個2是int類型)
無法將int類型的數值賦值給byte類型。
同理我們可以依次證明byte、short、char 運算時直接提升為int 。
二、強制轉換
前面我們將一個int類型的數據賦值給一個double類型,它會完成自動轉換。
那反過來會怎麼樣?
1.2默認是double數據類型,當把一個double數據類型的數據賦值給一個int類型時,編譯會報錯。
這個時候我們就需要強制轉換了
由此我們可以理解強制轉換的概念:
- 自動轉換是取值範圍小的類型自動轉換為取值範圍大的類型
- 強制轉換是取值範圍大的類型強制轉換成取值範圍小的類型
轉換格式:
<code> int i=(int)1.2; 數據類型 變量名 = (數據類型)被轉數據值;/<code>
也就是一個括號加上需要強制轉換的數據類型,強制轉換後會發現,i從1.2變成1了。
綜上我們可以發現:自動轉換時是Java自動執行的不需要我們參與,而強制轉換需要我們自己手動執行。
轉換原理:
前面我們學習了字節,其取值範圍為[-128,127]
定義一個byte類型的變量,賦值一個在它範圍之外的一個數,比如257
結果為何為1?
257超過了byte類型的取值範圍,默認為int類型,int類型4個字節,也就是32位。
強制轉換為byte類型,會丟失前三個字節的數據。
故:強轉有風險,操作需謹慎
- 精度損失:浮點轉成整數,直接取消小數點,可能造成數據損失精度。
- 數據溢出:int 強制轉成byte 砍掉3個字節,可能造成數據丟失。
三、ASCII編碼表
在學習二進制中我們便知道了計算機底層都是二進制數據(0和1)
那如何讓計算機識別人類的文字呢?
於是就產生出了編碼表的概念。
編碼表 就是將人類的字符和一個十進制數進行對應起來組成一張表格。
表中每個字符都對應了一個十進制數值,如下:
記住最常見的幾個:
- 字符0對應數字48
- 字符9對應數字57
- 大寫字母A對應65
- 大寫字母Z對應90
- 小寫字母a對應97
- 小寫字母z對應122
PS:0~9是字符時,也有對應的十進制數字
每個字符都對應一個數值。如果要進行數值運算,字符可以 代表其對應的數值,比如char轉int:
<code> int i ='0';//此時'0'是一個字符而不是一個數字 System.out.println(i);//結果是48 System.out.println('0'+1)//結果是49/<code>
總結: