Java-數據類型總結

Java 中提供了八種數據類型:6個數字類型(四個整數型,兩個浮點型)、字符類型、布爾型。java

依次分別是 : byte、int、short、long、float、double、char、boolean。spa

  • byte類型數據佔1個字節,8位,最高位表示符號,則表示範圍是:-2^7~2^7-1
  • int類型數據佔4個字節,共32位,最高位表示符號,則表示範圍是:-2^31~2^31-1
  • short類型數據佔2個字節,共16位,最高位表示符號,則表示範圍是:-2^15~2^15-1
  • long類型數據佔8個字節,共64位,最高位表示符號,則範圍是:-2^63~2^63-1
  • float數據類型佔4個字節,共32位,範圍是:10^-38~10^38和-10^38~-10^-38
  • double數據類型佔8個字節,共64位,範圍是:10^-308~10^308和-10^308~-10^-308
  • char數據類型佔2個字節,但最高位不用來表示符號。用它能表示 Unicode 集裏的 0~2^16-1(0~65535) 位置的字符

    char數據類型應用有如下方式:code

    如:char a='A'; char a=97(不能用short類型,由於最高位表示符號,故表示數值的只有15位);內存

具體的能夠參考下圖:
1555732454082.pngrem

二、數據類型轉換時出現的問題

2.一、自動轉換

一個 int 類型變量和一個 byte 類型變量進行相加,運算的結果是:變量的類型將是 int 類型。編譯器

這就是出現了數據類型的自動類型轉換現象。it

數據類型自動轉換:將取值範圍小的類型自動轉換爲取值範圍大的類型。編譯

一樣道理,當一個 int 類型變量和一個 double 變量運算時, int 類型將會自動提高爲 double 類型進行運算。class

代碼示例:
public class DataDemo {
    public static void main(String[] args) {
        int a = 1;
        byte b = 2;
//      byte c = a + b;
//      int類型和byte類型運算,結果是int類型
        int c = a + b;
        System.out.println(c);
    }
}

轉換原理圖解:
1555732788248.png變量

轉換規則:

範圍小的類型向範圍大的類型提高:byte、short、char 運算時候直接提高爲 int。

byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double。

2.二、強制類型轉換

將 1.5 賦值到 int 類型變量:產生編譯失敗,沒法賦值。

要修改成:

int i = (int)1.5; //可是這樣會致使 1.5 變成 1。

doubled=(int)2.5; // double類型數據強制轉成int類型,直接去掉小數點。

double 類型內存8個字節, int 類型內存4個字節。 1.5 是 double 類型,取值範圍大於 int 。

強制類型轉換:將 取值範圍大的類型強制轉換成取值範圍小的類型 。

比較而言,自動轉換是 Java 自動執行的,而強制轉換須要咱們本身手動執行。

一樣道理,當一個 short 類型與 1 相加,咱們知道會類型提高,可是還想給結果賦值給short類型變量,就須要強制轉換。

代碼示例 A:
public class DataDemo2 {
    public static void main(String[] args) {

        /**
         *  int a=1.5; 編譯失敗,沒法賦值
         */
        int i = (int)1.5;
        double d=2.5;
        //int類型和double類型運算,結果是double類型
        //int類型會提高爲double類型
        double e = d + i;
        System.out.println(e);
    }
}
示例代碼 B:
public class DataDemo3 {
    public static void main(String[] args) {
        short s = 1;

        /**
         *  s = s + 1 會出現編譯失敗
         *
         *  緣由:
         *      s 和 1 作運算的時候,1 是 int 類型,s 會被提高爲 int 類型
         *      s+1 後的結果是 int 類型,將結果在賦值會 short 類型時發生錯誤
         *      short 內存2個字節,int 類型4個字節
         *      必須將 int 強制轉成 short 才能完成賦值
         */
        s= (short) (s+1);
        System.out.println(s);
    }
}
強制轉換原理圖解:

1555733457147.png

浮點轉成整數,直接取消小數點,可能形成數據損失精度。

int 強制轉成 short 砍掉2個字節,可能形成數據丟失。

2.三、+=符號擴展
示例代碼 A:
public class DataDemo4 {
    public static void main(String[] args) {
        short s = 1;
        s += 1;
        System.out.println(s);
    }
}
分析:

s += 1 邏輯上看做是 s = s + 1 計算結果被提高爲int類型,再向short類型賦值時發生錯誤,由於不能將 取值範圍大的類型賦值到取值範圍小的類型。可是, s=s+1進行兩次運算 , += 是一個運算符,只運算 一次,並帶有強制轉換的特色,也就是說 s += 1 就是 s = (short)(s + 1) ,所以程序沒有問題編譯經過, 運行結果是2.

示例代碼 B:
public class DataDemo5 {
    public static void main(String[] args) {
        byte b1=1;
        byte b2=2;
        byte b3=1+2;
        //byte b4 = b1 + b2;  編譯失敗
        System.out.println(b3);
    }
}
分析:

b3 = 1 + 2 , 1 和 2 是常量,爲固定不變的數據,在編譯的時候(編譯器javac),已經肯定了 1+2 的 結果並無超過byte類型的取值範圍,能夠賦值給變量 b3 ,所以 b3=1 + 2 是正確的。

反之, b4 = b2 + b3 , b2 和 b3 是變量,變量的值是可能變化的,在編譯的時候,編譯器javac不肯定 b2+b3的結果是什麼,所以會將結果以int類型進行處理,因此int類型不能賦值給byte類型,所以編譯失 敗。

相關文章
相關標籤/搜索