[英]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);
在這兩種情況下,您都在進行縮小轉換,這可能會導致信息丟失。
您將一個值為 257 (00000000 00000000 00000001 00000001 二進制) 的 int 轉換為一個字節。 因此,只保留 int 的最低(右)字節。 因此結果是二進制的 00000001,也就是 1。
這種轉換比較復雜。
第二步與第一次轉換相同:
323 是 00000000 00000000 00000001 01000011 二進制。 將 323 轉換為字節會保留最低(右)字節,即為 67。
以下是JLS關於此轉換的說明:
從浮點數到整數類型 T 的縮小轉換需要兩個步驟:
第一步,將浮點數轉換為 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 類型的最大可表示值。
第二步:
如果 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^7
到2^7-1
- 即-128
到127
。 由於257
高於127
,您最終會環繞到257-256=
1。即增加或減少256
直到它落入范圍內。同樣的情況也發生在第二種情況下。
字節可以存儲在-128 to 127
的范圍內,這意味着 1 字節(8 位)。 257
二進制值在轉換為字節后是100000001
,這意味着 8 位(從LSB
到MSB
)將得到00000001
值,它只是1
。 在這里,您顯式轉換類型,因此在將較高的數據類型轉換為較低的數據類型時會發生數據丟失。 后面的也一樣。 希望這會幫助你。
的十六進制表示
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.