最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java強制類型轉換的所有規(guī)則及說明

 更新時間:2024年06月14日 10:12:28   作者:緑水長流*z  
這篇文章主要介紹了Java強制類型轉換的所有規(guī)則及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

強制轉換

在Java中,我們也可以將==數據取值范圍大的轉換為數據取值范圍小到的==,這種轉換并不是自動的過程,而是需要我們手動的轉換,我們稱這種轉換為強制轉換。

例如下面代碼:

long a = 10;
int b = a;			// 報錯

long類型內存8個字節(jié),int類型內存4個字節(jié)。

long取值范圍大于int;想要賦值成功,只有通過強制類型轉換,將 long類型強制轉換成int類型才能賦值。

強制轉換:將 取值范圍大的類型 強制轉換成 取值范圍小的類型;比較而言,自動轉換是Java自動執(zhí)行的,而強制轉換需要我們自己手動執(zhí)行。

強制轉換格式:

數據類型 變量名 = (數據類型)被轉數據值;

將 1.5 賦值到 int 類型,代碼修改為:

long a = 10;
int b = (int)a;

同樣道理,當一個 short 類型與 int 類型相加,我們知道會類型提升,但是還想給結果賦值給 short 類型變量,就需要強制轉換。

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo04 {
    public static void main(String[] args) {
        // short類型變量,內存中存儲兩個字節(jié)
        short s = 1;
        int i = 1;
        
        /*
        出現(xiàn)編譯錯誤
        s和i做運算的時候,i是int類型,s會被提升為int類型
        s+i后的結果是int類型,將結果在賦值會short類型時發(fā)生錯誤
         */

//        s = s + i;                // 編譯失敗
        s = (short) (s + i);        // 強制轉換,編譯成功
        System.out.println(s);
    }
}

1.轉換圖解

short 類型內存占有2個字節(jié),在和 int類型運算時會提升為 int 類型 ,自動補充2個字節(jié),計算后的結果還是 int 類型,但最終被強轉為了short類型,占用2個字節(jié)空間。

2.浮點數與整數的底層存儲

下面是8個基本數據類型的取值范圍大?。?/p>

數據類型關鍵字內存占用取值范圍
字節(jié)型byte1個字節(jié)-128~127
短整型short2個字節(jié)-32768~32767
整型int(默認)4個字節(jié)-2147483648~2147483647
長整型long8個字節(jié)-2的63次方~2的63次方-1
單精度浮點數float4個字節(jié)1.4013E-45~3.4028E+38
雙精度浮點數double(默認)8個字節(jié)4.9E-324~1.7977E+308
字符型char2個字節(jié)0-65535
布爾類型boolean1個字節(jié)true,false

我們可以發(fā)現(xiàn),int和float都是占用4個字節(jié)大小,但是float的取值范圍卻比int要大的多。同樣的情況在long與double這兩種類型上也存在;

這是為什么呢?

double與long表示范圍的差距是由于存儲結構的不同導致的,換句話說我們保存1000這個數,我們long要存儲+1000,其二進制為001111101000,而double存儲的是+1E3。

拆開來看,存儲一個數double可以分成三部分:

  • 尾數位(1)
  • 基數位(10)
  • 指數位(3)

也就是用科學計數法來存儲,這簡單的1000就能看出差距,long存儲1000需要符號位(+)和數字位(1000),需要5位。而double存儲,卻只需要3位。

同樣一個數,double能夠用更少的內存存儲,所以多余的內存就能存儲更多的數,因此double > long

通過如下代碼可以查看到每個類型的最大值:

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo01 {
    public static void main(String[] args) {
        // 2147483647
        System.out.println(Integer.MAX_VALUE);
        
        // 3.4028235E38
        System.out.println(Float.MAX_VALUE);
        
        // 9223372036854775807
        System.out.println(Long.MAX_VALUE);
        
        // 1.7976931348623157E308
        System.out.println(Double.MAX_VALUE);
    }
}

3.整數之間的強制轉換

強制轉換指的是:取值范圍大的,轉換為取值范圍小的。強制轉換的時候尤其要注意轉換之后的類型是否能存儲之前的數據。

示例1:數值==沒有超出==轉換之后類型的取值范圍的情況

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo05_強制類型轉換_整數轉換_01 {
    public static void main(String[] args) {
        int a = 100;
        byte b = (byte) a;

        // byte也能存儲100,因此轉換的時候不會出現(xiàn)什么問題
        System.out.println(b);      // 100
    }
}

示例2:數值==超出了==轉換之后類型的取值范圍的情況

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo06_強制類型轉換_整數轉換_02 {
    public static void main(String[] args) {
        // 八個字節(jié): 00000000 00000000 0000000 10000100 01000000 11000000 11000000 10000000   ---> 十進制: 568022057088
        long a = 568022057088L;

        // 四個字節(jié): 01000000 11000000 11000000 10000000  ---> 十進制: 1086374016
        int b = (int) a;
        System.out.println(b);      // 1086374016

        // 兩個字節(jié): 11000000 10000000    ---> 十進制: -16256
        short c = (short) b;
        System.out.println(c);      // -16256

        // 一個字節(jié): 10000000             ---> 十進制: -128
        byte d = (byte) c;
        System.out.println(d);      // -128
    }
}

4.浮點數的強制轉換

1) 浮點數轉浮點數

示例1:數值==沒有超出==轉換之后類型的取值范圍的情況

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo07_強制類型轉換_浮點數轉浮點數_01 {
    public static void main(String[] args) {
        double a = 180.8D;
        float b = (float) a;

        System.out.println(b);          // 180.8
    }
}

示例2:數值==超出了==轉換之后類型的取值范圍的情況

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo07_強制類型轉換_浮點數轉浮點數_02 {
    public static void main(String[] args) {
        double a = 3.8E38D;
        float b = (float) a;

        // float的最大取值范圍為: 1.4013E-45~3.4028E+38,無法存儲3.8E38,賦值失敗
        System.out.println(b);          // Infinity
    }
}

超出最大容量:

2) 浮點數轉整數

浮點數強制轉換為整數類型時也會出現(xiàn)一定的問題;

示例1:浮點數強制轉換為整數,數值==沒有超出==轉換之后類型的取值范圍的情況

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo09_強制類型轉換_浮點數轉整數_01 {
    public static void main(String[] args) {
        double a = 18.8D;

        // 取值范圍: -2的63次方~2的63次方-1
        long b = (long) a;

        // 取值范圍: -2147483648~2147483647
        int c = (int) a;

        // 取值范圍: -32768~32767
        short d = (short) a;

        // 取值范圍: -128~127
        byte e = (byte) a;

        System.out.println(a);          // 18.8
        System.out.println(b);          // 18
        System.out.println(c);          // 18
        System.out.println(d);          // 18
        System.out.println(e);          // 18
    }
}

Tips:浮點數轉成整數后將會丟失精度,即小數點后面的通通丟失(注意,并不是四舍五入)

示例2:浮點數強制轉換為整數(long和int類型),數值==超出了==轉換之后類型的取值范圍的情況

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo10_強制類型轉換_浮點數轉整數_02 {
    public static void main(String[] args) {
        double a = 5.2E63;

        // 取值范圍: -2的63次方~2的63次方-1
        long b = (long) a;

        // 取值范圍: -2147483648~2147483647
        int c = (int) a;

        System.out.println(a);          // 5.2E63
        System.out.println(b);          // 9223372036854775807(long的最大值)
        System.out.println(c);          // 2147483647(int的最大值)
    }
}

Tips:當強制超出該類型的范圍時:如果是轉換為long或int類型,默認為該類型的最大取值范圍值

執(zhí)行結果:

示例3:浮點數強制轉換為整數(short和byte類型),數值==超出了==轉換之后類型的取值范圍的情況

在Java中,將doublefloat轉換為short/byte時,數值將首先轉換為int,然后轉換為short/byte,如果該數組超出了int的取值范圍,那么轉換為short或者byte時結果為-1,如果沒有超出int范圍,那么如果轉換為short將會截取2個字節(jié),轉換為byte將會截取1個字節(jié)。

示例代碼:

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
public class Demo11_強制類型轉換_浮點數轉整數_03 {
    public static void main(String[] args) {
        /*
        int的取值范圍(4個字節(jié)): -2147483648~2147483647
        short取值范圍(2個字節(jié)): 取值范圍: -32768~32767
        byte取值范圍(1個字節(jié)): -128~127
         */

        // 超出了int范圍,直接為-1
        System.out.println((short) 2147483648.8D);       // -1

        // 在int范圍內,截取兩個字節(jié)
        // 01111111 11111111 11111111 11111100      ---> 2147483644
        // 11111111 11111100    ---> -4
        System.out.println((short) 2147483644.4D);       // -4

        // 在int范圍內,截取兩個字節(jié)
        // 00000000 00001100 01101110 10110110   ---> 814774
        // 01101110 10110110    ---> 28342
        System.out.println((short) 814774.8D);           // 28342


        // 超出了int范圍,直接為-1
        System.out.println((byte) 2147483648.8D);       // -1

        // 在int范圍內,截取1個字節(jié)
        // 01111111 11111111 11111111 11111100      ---> 2147483644
        // 11111100    ---> -4
        System.out.println((byte) 2147483644.4D);       // -4

        // 在int范圍內,截取1個字節(jié)
        // 00000000 00001100 01101110 10110110   ---> 814774
        // 10110110    ---> -74
        System.out.println((byte) 814774.8D);           // -74
    }
}

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java打印菱形及直角和等腰三角形的方法

    java打印菱形及直角和等腰三角形的方法

    用Java輸出菱形本身是一個比較簡單的問題,這是Java初學者都要編寫的一個算法,下面這篇文章主要給大家介紹了關于java打印菱形及直角和等腰三角形的方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • IDEA2022.1創(chuàng)建maven項目規(guī)避idea2022新建maven項目卡死無反應問題

    IDEA2022.1創(chuàng)建maven項目規(guī)避idea2022新建maven項目卡死無反應問題

    這篇文章主要介紹了IDEA2022.1創(chuàng)建maven項目規(guī)避idea2022新建maven項目卡死無反應問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 深入分析Android系統(tǒng)中SparseArray的源碼

    深入分析Android系統(tǒng)中SparseArray的源碼

    這篇文章主要介紹了深入分析Android系統(tǒng)中SparseArray的源碼,SparseArray為Java實現(xiàn),需要的朋友可以參考下
    2015-07-07
  • 淺談spring中的default-lazy-init參數和lazy-init

    淺談spring中的default-lazy-init參數和lazy-init

    下面小編就為大家?guī)硪黄獪\談spring中的default-lazy-init參數和lazy-init。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java 運算符詳情

    Java 運算符詳情

    這篇文章主要介紹了Java 運算符,Java 中的運算符與 C 語言基本一致。下面文章就圍繞Java 中的運算符的相關資料展開內容,需要的朋友可以參考一下
    2021-11-11
  • 關于注解式的分布式Elasticsearch的封裝案例

    關于注解式的分布式Elasticsearch的封裝案例

    這篇文章主要介紹了關于注解式的分布式Elasticsearch的封裝案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 淺談Java安全之C3P0的使用

    淺談Java安全之C3P0的使用

    本文主要介紹了淺談Java安全之C3P0的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • mybatis-plus集成springboot實現(xiàn)XML映射器方式

    mybatis-plus集成springboot實現(xiàn)XML映射器方式

    本文詳細介紹了MyBatis-Plus中SQL映射配置的使用方法,包括動態(tài)SQL的支持和常見SQL操作的實現(xiàn),通過XML映射器,可以靈活地定義復雜的查詢語句,并處理動態(tài)條件和批量操作,文中還提供了具體的配置步驟和示例代碼,幫助開發(fā)者更好地理解和應用這些功能
    2026-03-03
  • 在非Spring管理對象中注入Spring Bean的解決方案

    在非Spring管理對象中注入Spring Bean的解決方案

    在SpringBoot開發(fā)中,我們習慣了通過@Autowired/@Resource等注解輕松注入依賴 Bean,但在WebSocket、定時任務等場景下,會遇到一個核心問題:非Spring創(chuàng)建的對象無法直接注入 Spring Bean,所以本文給大家介紹了在非Spring管理對象中注入Spring Bean的解決方案
    2026-02-02
  • java并發(fā)編程中實現(xiàn)可見性的四種可行方案解析

    java并發(fā)編程中實現(xiàn)可見性的四種可行方案解析

    這篇文章主要介紹了java并發(fā)編程中實現(xiàn)可見性的四種可行方案解析,使用關鍵字volatile和使用鎖(如synchronized關鍵字或者java.util.concurrent包中的鎖)來確保對共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到,需要的朋友可以參考下
    2023-08-08

最新評論

建平县| 桐庐县| 余庆县| 博湖县| 桐梓县| 教育| 绥宁县| 和平区| 固始县| 鲁甸县| 饶河县| 偃师市| 龙门县| 易门县| 堆龙德庆县| 安康市| 乌审旗| 开原市| 山东省| 兴和县| 六盘水市| 大安市| 根河市| 乐都县| 贞丰县| 濮阳县| 诸城市| 稷山县| 五原县| 遂溪县| 临武县| 安仁县| 社会| 察哈| 阿勒泰市| 环江| 龙南县| 海林市| 桃园市| 红河县| 平泉县|