整型和长整型转换

Integer and Long conversion

假设我想创建一个 long 值,其中包含两个打包的 int。我想把我的两个 int 并排打包在 long 中。我可以想到两种不同的方法来实现这一点,我相信这两种方法的工作方式相同:

int a = 0x7FFFFFFF;
int b = 0x10000000;
long x;

// Method one
x = (a & 0xFFFFFFFFL) << 32 | (b & 0xFFFFFFFFL);

// Method two
x = (long) (a << 32) | (long) a;

这两种方法有什么区别?它们在所有情况下都会产生相同的结果吗?

第二种方法不行。除了打字错误(它应该以长 b 结尾)之外,您的 a 不会受到转变的影响(感谢 harold 的更正)。转换前必须转换。

int a = 0x7FFFFFFF;
int b = 0x10000000;
long x;

// Method one
x = (a & 0xFFFFFFFFL) << 32 | b;

// Method two
x = (((long)a) << 32) | b;

此外,在第二种和第一种方法中,b 的转换是多余的。转换是隐式完成的。

这两种方法看起来很相似。但是,方法 1 可能会执行一些不必要的操作,因为它会执行额外的 AND 和转换。

方法一:

  • al <- a I2L
  • res <- al LAND 0xFFFFFFFFFL
  • res2 <- res LSHL 32
  • bl <- b I2L
  • al 或 bl

方法二:

  • al <- a I2L
  • res2 <- al LSHL 32
  • bl <- b I2L
  • al 或 bl