Java:4字节到32位整数
Java: 4 bytes to 32 bit integer
我正在尝试理解以下代码:
int omgezetteTijd =
((0xFF & rekenOmNaarTijdArray[0]) << 24) | ((0xFF & rekenOmNaarTijdArray[1]) << 16) |((0xFF & rekenOmNaarTijdArray[2]) << 8) | (0xFF & rekenOmNaarTijdArray[3]);
我不明白的是你为什么用 OxFF 与它,你用 8 位值与 8 位值像这样 (11111111),所以这应该给你相同的结果。
但是,当我不使用 AND 它与 OxFF 时,我得到负值?无法弄清楚为什么会这样?
当您 或 一个带有 int 的字节时,该字节将被提升为 int。默认情况下,这是通过 sign extension 完成的。换句话说:
// sign bit
// v
byte b = -1; // 11111111 = -1
int i = (int) b; // 11111111111111111111111111111111 = -1
// \______________________/
// sign extension
通过 & 0xFF
可以避免这种情况。即
// sign bit
// v
byte b = -1; // 11111111 = -1
int i = (int) (0xFF & b); // 00000000000000000000000011111111 = 255
// \______________________/
// no sign extension
0xFF 作为 byte
代表数字-1。当它转换为 int
时,它仍然是 -1,但由于符号扩展,它具有位表示 0xFFFFFFFF
。 & 0xFF
避免了这种情况,在转换为 int 时将字节视为无符号。
我正在尝试理解以下代码:
int omgezetteTijd =
((0xFF & rekenOmNaarTijdArray[0]) << 24) | ((0xFF & rekenOmNaarTijdArray[1]) << 16) |((0xFF & rekenOmNaarTijdArray[2]) << 8) | (0xFF & rekenOmNaarTijdArray[3]);
我不明白的是你为什么用 OxFF 与它,你用 8 位值与 8 位值像这样 (11111111),所以这应该给你相同的结果。
但是,当我不使用 AND 它与 OxFF 时,我得到负值?无法弄清楚为什么会这样?
当您 或 一个带有 int 的字节时,该字节将被提升为 int。默认情况下,这是通过 sign extension 完成的。换句话说:
// sign bit
// v
byte b = -1; // 11111111 = -1
int i = (int) b; // 11111111111111111111111111111111 = -1
// \______________________/
// sign extension
通过 & 0xFF
可以避免这种情况。即
// sign bit
// v
byte b = -1; // 11111111 = -1
int i = (int) (0xFF & b); // 00000000000000000000000011111111 = 255
// \______________________/
// no sign extension
0xFF 作为 byte
代表数字-1。当它转换为 int
时,它仍然是 -1,但由于符号扩展,它具有位表示 0xFFFFFFFF
。 & 0xFF
避免了这种情况,在转换为 int 时将字节视为无符号。