有人可以向我解释为什么我得到这些结果吗?

public static int ipv4ToInt(String address) {
    int result = 0;

    // iterate over each octet
    for(String part : address.split(Pattern.quote("."))) {

        // shift the previously parsed bits over by 1 byte
        result = result << 8;

        System.out.printf("shift = %d\n", result);

        // set the low order bits to the current octet
        result |= Integer.parseInt(part);

        System.out.printf("result = %d\n", result);
    }
    return result;
}

对于ipv4ToInt(“10.35.41.134”),我得到:

平移= 0
结果= 10
移动= 2560
结果= 2595
移位= 664320
结果= 664361
班次= 170076416
结果= 170076550
10.35.41.134 = 170076550

这是我自己做数学时得到的结果。

对于ipv4ToInt(“192.168.0.1”),我得到:

平移= 0
结果= 192
移动= 49152
结果= 49320
移位= 12625920
结果= 12625920
平移= -1062731776
结果= -1062731775
192.168.0.1 = -1062731775

对于这一点,当我手动进行数学运算时,我得到了3232235521。

有趣的是:
3232235521 = 11000000101010000000000000000001
当我在Windows calc中输入1062731775并点击+/-按钮时,我得到:
-1062731775 = 11111111111111111111111111111111 11000000101010000000000000000001

该功能仍然可以满足我的目的,但是我真的很好奇,为什么我最后一次移位时结果为什么会变为负数?

最佳答案

因为您的情况有点溢出!

在Java中,整数也是32位,范围为-2,147,483,648至2,147,483,647。
12625920 << 8越过2 ^ 31-1的限制,因此结果变为负数...

结果只是从-ve侧翻转,因此,从正侧剩下的任何范围都伴随着从负侧得到的很多!!!

正如每个人的建议,您应该使用long变量以避免溢出!

关于java - 按位操作意外变为负数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25918757/

10-09 05:48