整型和长整型转换
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
假设我想创建一个 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