gpt4 book ai didi

java - 位打包导致 Java 中的错误值

转载 作者:行者123 更新时间:2023-12-02 13:34:30 25 4
gpt4 key购买 nike

我在 Java 中使用以下方法将一组四个字节的整数表示形式组合成一个 long。

public static long addBytesToInt(int x1, int x2, int x3, int x4) {
return ((x4 << 24) | (x3 << 16) | (x2 << 8) | (x1 & 0xFF));
}

但问题是,如果我使用以下值来调用它:

//1111 1111 0000 1111 0011 1100 0000 0011 = 4279188483    
addBytesToInt(3, 60, 15, 255);

它会返回错误的值。我必须更改为以下代码才能使其按预期工作,但我无法弄清楚原因:

public static long addBytesToInt(int x1, int x2, int x3, int x4) {
long l = 0;

l = (l << 8) + x4;
l = (l << 8) + x3;
l = (l << 8) + x2;
l = (l << 8) + x1;

return l;
}

最佳答案

((x4 << 24) | (x3 << 16) | (x2 << 8) | (x1 & 0xFF)) 的问题与操作数的类型有关。自 x1 -x4全部都有类型int ,每次移位操作的结果也有类型 int 。因此,每个算术或运算的结果都具有类型 int , 也。当x4值大于 127,即最终 int结果有其符号位设置,因此表示负数。当该数字转换为long时对于返回,保留(负)值。

由于结果long value 的所有低 32 位均已正确设置,解决该问题的最简单方法是屏蔽掉 32 个高位。即,申请 & 0xffffffffL操作到当前结果。

这同样不适用于您的工作选择。由于变量 l类型为long ,每个操作都会产生 long 类型的结果。不会发生溢出,并且符号位不会被设置。

关于java - 位打包导致 Java 中的错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43079014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com