java 基本數據類型及自動類型提升


1.Java的8種基本數據類型及其所占空間大小:

  boolean  8bit/1byte
      byte      8bit/1byte
      char      16bit/2byte
      short     16bit/2byte
  float      32bit/4byte
      int        32bit/4byte
      long      64bit/8byte
      double  64bit/8byte
 

2.Java自動類型轉換

     1)兩種類型是彼此兼容的
     2)轉換的 目的類型占得空間范圍一定要大於轉化的 源類型

  正向過程:由低字節向高字節自動轉換

    byte->short->int->long->float->double

  逆向過程:使用強制轉換,可能丟失精度。

     int a=(int)3.14;

3. Java數據類型自動提升(注意以下討論的是二元操作符)

    Java定義了若干使用於表達式的類型提升規則: 
   1) 所有的byte型. short型和char型將被提升到int型(例外: final修飾的short, char變量相加后不會被自動提升。)
   2)如果一個操作數是long形 計算結果就是long型;
   3)如果一個操作數是float型,計算結果就是float型;
   4)如果一個操作數是double型,計算結果就是double型;
 
   另一種歸納方式(《Java核心技術卷I》P43):   
  如果兩個操作數其中有一個是double類型,另一個操作就會轉換為double類型。
  否則,如果其中一個操作數是float類型,另一個將會轉換為float類型。
  否則,如果其中一個操作數是long類型,另一個會轉換為long類型。
  否則,兩個操作數都轉換為int類型。
 
    eg 1:
 1     Promote.java class promote 
 2     {  
 3         public static void main (string args[]) 
 4         { 
 5             byte b = 50;
 6             char c = 'a';
 7             short s = 1024; 
 8             int i = 50000; 
 9             float f =5.67f; 
10             double d =0.1234; 
11             double result = (f * b) + (i / c) - (d * s);        
12          } 
13      } 
     講解:
      第一個表達式f * b中,b被提升為float類型,該子表達式的結果也提升為float類型。 
      第二個表達式i / c中,變量c被提升為int類型,該子表達式的結果提升為int類型。
      第三個表達式d * s中,變量s被提升為double類型,該子表達式的結果提升為double型。
      最后,這三個結果類型分別是float,int和double類型,想減后該表達式的最后的結果就是double類型。

    5) 黙認浮點類型為double,float數據類型有一個后綴為" f "或" F "。

    6) long類型有一個后綴,為" l " 或者" L "。

 eg 2:

1   byte a = 1;
2 
3   byte b = 2;
4 
5   a = a+b;      //編譯出錯自動類型提升成int
6 
7   a += b;       //自加沒有自動類型提升問題

  把高字節轉成低字節,需要作強制類型轉換. byte c=(byte)a+b;

 

eg 3:

1 byte b1=1,b2=2,b3,b6; 
2 final byte b4=4,b5=6; 
3 b6=b4+b5; 
4 b3=(b1+b2);   //會發生編譯錯誤 5 System.out.println(b3+b6);

  沒有final修飾的變量相加后會被自動提升為int型,與目標類型byte不相容,需要強制轉換(向下轉型)。

4. Java強制類型轉換

     格式:目標類型 變量=(目標類型)源類型變量/常量
     eg:
        int i=5;
        byte j=(int)i;
     注意:在強制類型轉換中目標類型和源類型變量的類型始終沒有發生改變
     易錯點:
        byte b;
        b=3;
        b=(byte)b*3     //編譯出錯,因為(byte)的運算級別比*高,所以會先轉換b后再*3
        b=(byte)(b*3)   //正確
 
參考博文: 
http://blog.csdn.net/liang5630/article/details/37935383
http://blog.sina.com.cn/s/blog_66e7f79b0100ysd3.html

 


免責聲明!

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



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