Java:4字节到32位整数

时间:2015-01-22 20:15:11

标签: java integer byte unsigned signed

我试图理解以下代码:

int omgezetteTijd = ((0xFF & rekenOmNaarTijdArray[0]) << 24) | ((0xFF & rekenOmNaarTijdArray[1]) << 16) |((0xFF & rekenOmNaarTijdArray[2]) << 8) | (0xFF & rekenOmNaarTijdArray[3]);

我不明白为什么你和它一起使用OxFF,你正在使用8位这样的8位值(11111111),所以这应该给你相同的结果。

但是,当我不和它一起使用OxFF我会得到负值?不知道为什么会这样?

2 个答案:

答案 0 :(得分:4)

带有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

答案 1 :(得分:3)

0xFF作为byte表示数字-1。当它转换为int时,它仍为-1,但由于符号扩展,它具有位表示0xFFFFFFFF& 0xFF避免这种情况,在转换为int时将字节视为无符号。