簡體   English   中英

在 Java 中將類型轉換為字節

[英]Type casting into byte in Java

我是 Java 的初學者。 我遇到了一個叫做類型轉換的概念。 我有以下片段-

    class Demo
    {
        byte b;
        int a=257;
        double d= 323.142
        b=(byte)a;
          System.out.println(b);
        b=(byte)d;
          System.out.println(b);

    }

代碼的輸出是1 67

任何人都可以向我解釋輸出。

提前致謝!

byte類型以 8 位編碼,因此其值介於 -128 和 127 之間。在您的情況下,按byte轉換與計算模數並四舍五入為int 試試下面的代碼,輸出是一樣的:

int a = 257;
double d = 323.142;
System.out.println(a % 128);
System.out.println((int) d % 128);

在這兩種情況下,您都在進行縮小轉換,這可能會導致信息丟失。

  1. int 到 byte 的轉換

您將一個值為 257 (00000000 00000000 00000001 00000001 二進制) 的 int 轉換為一個字節。 因此,只保留 int 的最低(右)字節。 因此結果是二進制的 00000001,也就是 1。

  1. 雙字節到字節的轉換

這種轉換比較復雜。

  • 在第一步中 323.142 從 double 轉換為 int,所以它變成了 323。
  • 第二步與第一次轉換相同:

    323 是 00000000 00000000 00000001 01000011 二進制。 將 323 轉換為字節會保留最低(右)字節,即為 67。

以下是JLS關於此轉換的說明:

從浮點數到整數類型 T 的縮小轉換需要兩個步驟:

  1. 第一步,將浮點數轉換為 long(如果 T 是 long)或轉換為 int(如果 T 是 byte、short、char 或 int),如下所示:

    • 如果浮點數為 NaN(第 4.2.3 節),則轉換的第一步的結果是 int 或 long 0。

    • 否則,如果浮點數不是無窮大,浮點值將被舍入為整數值 V,使用 IEEE 754 向零舍入模式(第 4.2.3 節)向零舍入。 那么有兩種情況:

      一種。 如果T是long,並且這個整數值可以用long表示,那么第一步的結果就是long值V。

      否則,如果這個整數值可以表示為一個int,那么第一步的結果就是int值V。

    • 否則,以下兩種情況之一必須為真:

      一種。 該值必須太小(大的負值或負無窮大),並且第一步的結果是 int 或 long 類型的最小可表示值。

      該值必須太大(大的正值或正無窮大),並且第一步的結果是 int 或 long 類型的最大可表示值。

  2. 第二步:

    • 如果 T 是 int 或 long,則轉換的結果是第一步的結果。

    • 如果 T 是 byte、char 或 short,則轉換的結果是第一步結果的收縮轉換到類型 T(第 5.1.3 節)的結果。

byte b;
int a=257;
double d= 323.142
b=(byte)a; // 257-256=1
  System.out.println(b); // now b is 1
b=(byte)d; // 323.142-256=67
  System.out.println(b); // now b is 67

byte 數據類型是一個 8 位有符號二進制補碼整數(這在第二種情況下很重要,為什么67.142變成67 )。 Java字節是有符號的,因此它的范圍是-2^72^7-1 - 即-128127 由於257高於127 ,您最終會環繞到257-256= 1。即增加或減少256直到它落入范圍內。同樣的情況也發生在第二種情況下。

字節可以存儲在-128 to 127的范圍內,這意味着 1 字節(8 位)。 257二進制值在轉換為字節后是100000001 ,這意味着 8 位(從LSBMSB )將得到00000001值,它只是1 在這里,您顯式轉換類型,因此在將較高的數據類型轉換為較低的數據類型時會發生數據丟失。 后面的也一樣。 希望這會幫助你。

的十六進制表示

  • (257) = 0x1 01
  • (323) = 0x1 43

byte僅存儲一個字節的數據,正如您在上面的十六進制表示中看到的突出顯示部分:-

b = 0x01 = 1表示 257 和b = 0x43 = 67表示 323.14 的整數部分

注意:-在 Java 中, double使用 52 位尾數,因此我們可以表示 32 位整數而不會丟失數據。

因為 257 = 100000001b 但是當你把它轉換成字節時,你只能得到這個數字的 8 位:00000001b = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM