day04_基本數據類型轉換丶進制

基本數據類型轉換

  • 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 , 所以機器可以只有加法而沒有 減法, 這樣計算機運算的設計就更簡單了。
  • 對於正數來講:原碼、反碼、補碼是相同的:三碼合一。
  • 計算機底層都是使用二進制表示的數值
  • 計算機底層都是使用的數值的補碼保存數據的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章