【问题标题】:Java: 4 bytes to 32 bit integerJava:4 字节到 32 位整数
【发布时间】:2015-03-21 18:46:00
【问题描述】:

我试图理解以下代码:

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

我不明白的是,你为什么要与 OxFF 进行 AND 运算,你将一个 8 位的值与 8 位(11111111)进行与运算,所以这应该会给你相同的结果。

但是,当我不使用 OxFF 进行 AND 时,我得到的是负值?不知道为什么会这样?

【问题讨论】:

  • 你为什么要重复 ByteBuffer 可以为你做的工作?
  • 因为我想了解不同的数据类型并知道如何使用它们:)

标签: java integer byte unsigned signed


【解决方案1】:

当你或一个带有int的字节时,该字节将被提升为一个int。默认情况下,这是使用sign extension 完成的。换句话说:

                           //                      sign bit
                           //                         v
byte b = -1;               //                         11111111 = -1
int i = (int) b;           // 11111111111111111111111111111111 = -1
                           // \______________________/
                           //      sign extension

通过&amp; 0xFF 你可以防止这种情况发生。即

                           //                      sign bit
                           //                         v
byte b = -1;               //                         11111111 = -1
int i = (int) (0xFF & b);  // 00000000000000000000000011111111 = 255
                           // \______________________/
                           //     no sign extension

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 2010-12-19
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2011-06-10
      相关资源
      最近更新 更多