我试图理解以下代码段:
int omgezetteTijd =
((0xFF & rekenOmNaarTijdArray[0]) << 24) | ((0xFF & rekenOmNaarTijdArray[1]) << 16) |((0xFF & rekenOmNaarTijdArray[2]) << 8) | (0xFF & rekenOmNaarTijdArray[3]);
我不明白的是,为什么你和它与 OxFF 一起,你用 8 位 (11111111) 来识别一个 8 位值,所以这应该给你相同的结果。
但是,当我不这样做并且它与 OxFF 一起时,我得到的是负值?不知道为什么会这样?
当您或带有 int 的字节时,该字节将提升为 int。默认情况下,这是通过符号扩展完成的。换句话说:
// 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
避免这种情况,在转换为整数时将字节视为无符号。