我无法弄清楚这种现象的原因。我想将字节值OxAB左移8位。然后,我想将其转换为long。

byte oneByte = (byte) 0xAB;
long converted = (oneByte & 0xFF) << 8;
System.out.println(converted);


在这种情况下,输出为43776。但是,如果我将代码更改为此:

byte oneByte = (byte) 0xAB;
long converted = (oneByte) << 8;
System.out.println(converted);


输出更改为-21760。我有以下问题:


0xFF的数据类型是什么?
为什么按位AND与0xFF阻止符号扩展?

最佳答案

long converted = onebyte; // gives you -85


如果您将其向左移动8次,则可以得到-21760
因为在转换为long的过程中,最左边的位用作符号位。

long converted = onebyte & 0xFF; //gives you 171


如果将它向左移动8次,则可以得到43776

因为当使用按位和字节时,short和char首先被转换为int然后执行按位运算。

11111111111111111111111110101011 //byte 0xAB casted to int
00000000000000000000000011111111 //0xFF is an int literal
00000000000000000000000010101011 //bitwise and operation


在按位之后并使用0xFF将符号位删除

关于java - Java左移澄清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60635098/

10-09 05:49