Java-为什么尝试将范围以外的值存储在其中时,为什么INT默认为0

  • 本文关键字:在其中 存储 默认 INT 范围 Java- java
  • 更新时间 :
  • 英文 :


我有一个简单的程序,用于计算x的功率。

    public static int calculatePower(int x, int y) {
    int result = 1;
    if (y == 0)
        return result;
    for (int i = 1; i <= y; i++) {
        result = result * x;
    }
    return result;
}

当我将参数传递给4和15时,我将值返回为1073741824。但是,当参数为4和16时,返回的值为零。

如果不能将外部范围值存储在int中,是否应该保留最后值-1073741824?

如果不能将外部范围值存储在int中,是否应该保留最后值-1073741824?

否,它是按照每个操作的JLS中列出的溢出规则存储最终操作的结果。

如果整数乘法溢出,则结果是数学乘积的低阶位,如某些足够大的两种组合格式所示。结果,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不一样。

并不是结果"默认"到0,只是操作的一个一个最终溢出,因此最后32位全部为0。结果0。

您可以看到,如果您在每个步骤中添加诊断:

public class Test {
    public static void main(String[] args) {
        calculatePower(4, 16);
    }
    public static int calculatePower(int x, int y) {
        int result = 1;
        for (int i = 0; i < y; i++) {
            System.out.printf("%d * %d = %d%n", result, x, result * x);
            result = result * x;
        }
        return result;
    }
}

我同时简化了您的循环,这意味着您不需要事先的基本情况。请注意,您的原始代码和我的版本都不处理负功率 - 对于生产代码,您应该检查并提出异常。

输出:

1 * 4 = 4
4 * 4 = 16
16 * 4 = 64
64 * 4 = 256
256 * 4 = 1024
1024 * 4 = 4096
4096 * 4 = 16384
16384 * 4 = 65536
65536 * 4 = 262144
262144 * 4 = 1048576
1048576 * 4 = 4194304
4194304 * 4 = 16777216
16777216 * 4 = 67108864
67108864 * 4 = 268435456
268435456 * 4 = 1073741824
1073741824 * 4 = 0

如果将其提高到更大的力量,例如20,您会在末尾看到" 0 * 4 = 0"行。

1073741824 + 1因为溢出而给您一个值-1073741824

4和15基本上是2^16

4和16基本上是2^17

2^172^ 16的双重。这就是为什么它变成1 and all 16 bits are zero。因此,挑选所有16个下部。

它不默认为0。

相关内容

最新更新