[英]Java “int i = byte1 | 0x0200” vs “int i = byte1”?
在位和移位操作中,類型
byte
被隱式轉換為int
。 如果字節值是負數 ,則最高位是1,那么將使用1來填充int中的額外字節。 所以byte b1=-5; int i = b1 | 0x0200;
將給出i == -5作為結果。
我了解0x0200
等於0b0000 0010 0000 0000
。 但是在上面顯示的段落中0x0200
的意義是什么?
我的意思是-b1 b1 | 0x0200
b1 | 0x0200
將始終等於i
(請參見下面的“ 我的測試 ”),然后在上面的段落中,為什么不簡單地將byte b1=-5; int i = b1
寫入byte b1=-5; int i = b1
byte b1=-5; int i = b1
嗎?
我的測試 :
public static void main(final String args[]) {
final byte min_byte = Byte.MIN_VALUE; // -128
final byte limit = 0; // according to the bolded words in the passage
for (byte b = min_byte; b < limit; ++b) {
final int i1 = b;
final int i2 = b | 0x0200;
if (i1 != i2) { // this never happens!
System.out.println(b);
}
}
}
但是在上面顯示的段落中0x0200的意義是什么?
這樣做僅出於說明目的:值0x200
在一個位置等於1
的位置成1
。 這個想法是要表明結果不是0x000002FB
,而是實際為-5
,即0xFFFFFFFB
。
我了解0x0200等於0b1111 1110 0000 0000
不,不是。 正確的值由
int i = 0x0200; // <-- decimal 512
System.out.println(Integer.toBinaryString(i));
哪個輸出
1000000000
如果我們檢查您的第二個價值,
byte b1 = -5;
System.out.println(Integer.toBinaryString(b1));
我們得到
11111111111111111111111111111011
排列兩個數字
11111111111111111111111111111011
00000000000000000000001000000000
它似乎很清楚,結果將是位值-5
(因為只有0
在-5
也是0
在0x0200
)。 為了確定意義,我們可以檢查
int i = 0x0200; // <-- Decimal 512
System.out.println("Dec: " + Integer.toBinaryString(i).length());
產量
Dec: 10
因此,給定的按位或將強制第十位為真。 在您的輸入字節中確實如此,但是如果您使用-十進制1535( 0b 101 1111 1111
),那么您會得到,
System.out.println(1535 | 0x0200);
輸出是
2047
因為如果您對兩個數字進行按位或運算
01000000000
10111111111
你得到
11111111111
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.