2 回答
TA贡献1155条经验 获得超0个赞
这是由于int
数据类型溢出。
Java 的int
大小是 32 位,因此范围是 -2,147,483,648 到 2,147,483,647。
2^31 = 2147483648
因此它溢出到 -2147483648,因为 2,147,483,647 的二进制值是 01111111111111111111111111111111(一个 0 和 31 个 1),其中第一位是“符号位”(2 的补码形式)。
如果您尝试将这个限制 (2,147,483,647) 超出 1(即加 1),它会将符号位更改为 1,使其为int
负。
所以它会变成 1000000000000000000000000000000(1 个一和 31 个零),给你答案 -2147483648。
TA贡献1851条经验 获得超4个赞
较大的指数返回 0(但是我认为这可能与我们需要使用 int 与 long 的事实有关。)
正确的。
int i = (int) 2147483648L; // -2147483648 due to over flow
int j = i * 2; // 0 due to overflow.
您可以使用long但是这有同样的问题,但价值更高。
public static long recPower(int baseNum, int power) {
if (power < 0) throw new IllegalArgumentException();
return power == 0 ? 1L : baseNum * recPower(baseNum, power - 1);
}
检查溢出的一种方法是查看
public static long recPower(int baseNum, int power) {
if (power < 0) throw new IllegalArgumentException();
return power == 0 ? 1L : baseNum * recPower(baseNum, power - 1);
}
或检查溢出
public static long recPower(int baseNum, int power) {
if (power < 0) throw new IllegalArgumentException();
return power == 0 ? 1L
: Math.multiplyExact(baseNum, recPower(baseNum, power - 1));
}
您可以使用 BigInteger,它的限制要大得多。
添加回答
举报