Java 基礎 - 原生類型


更詳細的說明,請參考: Java 原生類型與包裝器類型深度剖析,https://blog.csdn.net/justloveyou_/article/details/52651211

一. 原生類型與包裝器類型

1Byte = 8 Bits

 

二. 自動轉型與強制轉型

精度(低1-高5)    
1 byte(1字節) Byte
short(2字節) Short
char(2字節) Character
     
2 int(4字節) Integer
     
3 long(8字節) Long
     
4 float(4字節) Float
     
5 double(8字節) Double
     
NA boolean(未定) Boolean

1、 自動轉型

自動轉型總原則:byte,short,char(同級)-> int -> long -> float -> double (由低精度到高精度)

 

1.1 由低精度到高精度的自動轉換

具體可分為以下兩種情形:

 

 1)從位數低的類型向位數高的類型轉換

byte b = 1;
char c = 1;
short s = 1;
int i = 1;


c = b; // Error,同級
c = s; // Error,同級
s = c; // Error,同級
i = c; // OK

 

 

2) 從整型向浮點型的轉換

 

int i = 1long t = 1;
float f = 1;
double d = 1;


f = i; // Ok
f = t; // Ok
d = f; // Ok

 

1.2 運算符對基本類型的影響

具體可分為以下兩種情形:

1) 當使用 +、-、*、/、%、==、>、< 等 等運算符對基本類型進行運算時,遵循如下規則:

  兩個操作數中,先考慮是否有一個是double類型的。如果有,另一個操作數和結果 將會被轉換成double類型。再依次考慮float,long。除此之外,兩個操作數(包括byte、short、int、char)都將會被轉換成int類型。

byte b1 = 10 ;  //OK,會檢查發現10沒有超過byte類型的最大值
byte b2 = 12;   //OK,會檢查發現12沒有超過byte類型的最大值

byte b = b1 + b2; //Error,byte類型在計算時會自動提升為int類型,此時就會報錯,因為b1+b2實際上是int類型,但是左側的變量為byte類型。

short s1=1; //OK,會檢查發現1沒有超過short類型的最大值
s1=s1+1;    //Error,因為s1+1 結果int,但左側變量為 short,報錯

s1++;      //OK,不會報錯,與s1=s1+1不同!!!,會檢查發現2沒有超過short類型的最大值

s1=1+1;   //OK,1+1 是個編譯時可以確定的常量,'+'運算在編譯時就被執行了,而不是在程序執行的時候,這個語句的效果等同於s1=2

 

2) 當使用 +=、-=、*=、/=、%=  i++、 ++i 運算符對基本類型進行運算時,遵循如下規則:

  運算符右邊的數值將首先被強制轉換成與運算符左邊數值相同的類型,然后再執行運算,且運算結果與運算符左邊數值類型相同。自增(減)運算也類似。

short s1=1; // OK,會檢查發現1沒有超過short類型的最大值
short s2;

s1+=1;    // OK,正確,1首先被強制轉換為short型,然后再參與運算,並且結果也是short類型

s2 = ++s1;     // OK,正確,s2的值為2

 

2、強制轉型 

強制轉換的格式是在需要轉型的數據前加上 “( )”, 然后在括號內加入需要轉化的數據類型。主要發生於以下兩種情形:

  • 由高精度向低精度轉換

  • 一種類型到另一種類型轉換,則必須使用強制類型轉化(同級之間:byte,short,char)

 byte b = 3;
 int i = 3;
 long t = 3;
 float f = 3;
 char c = 3;
 short s = 3;

 i = (int) f;  // OK,由高精度向低精度轉換
 t = (long) f;  // OK,由高精度向低精度轉換
 b = (byte) i;  // OK,由高精度向低精度轉換

 i = b; // OK,由低精度向高精度轉換,自動轉型
 System.out.println(c==s);  // OK,true,c 和 s 自動轉型為int,然后比較

 b = (byte) s;  // OK,一種類型到另一種類型轉換
 c = (char) b;  // OK,一種類型到另一種類型轉換
 c = (char) s;   // OK,一種類型到另一種類型轉換

特別需要注意的是,強制轉換常常會導致二進制位的截取,甚至會導致意想不到的結果:

int i = 128;
byte b = (byte)i;
System.out.println(b);           // -128(即-0)

 

 

 

---------------------
作者:書呆子Rico
來源:CSDN
原文:https://blog.csdn.net/justloveyou_/article/details/52651211
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM