【发布时间】:2014-08-31 19:38:40
【问题描述】:
int 的限制是从 -2147483648 到 2147483647。
如果我输入
int i = 2147483648;
那么Eclipse会在“2147483648”下面提示一个红色下划线。
但如果我这样做:
int i = 1024 * 1024 * 1024 * 1024;
它会编译得很好。
public class Test {
public static void main(String[] args) {
int i = 2147483648; // error
int j = 1024 * 1024 * 1024 * 1024; // no error
}
}
也许这是Java中的一个基本问题,但我不知道为什么第二个变体不会产生错误。
【问题讨论】:
-
即使编译器通常会将计算“折叠”为单个值作为优化,但如果结果溢出,它也不会这样做,因为任何优化都不应该改变程序的行为.
-
它不能解释
2147483648:这个字面没有意义。 -
而且 Java 不会报告整数溢出——操作会默默地“失败”。
-
@JacobKrall:无论是否启用了检查性,C# 都会将此报告为缺陷;除非在未经检查的区域内,否则所有仅包含常量表达式的计算都会自动检查。
-
我不鼓励你在 StackOverflow 上问“为什么不”的问题;他们很难回答。 “为什么不”的问题预设了世界显然应该是这样的,它不是这样的,并且需要有充分的理由让它这样。这个假设几乎永远不会成立。一个更精确的问题是“规范的哪一部分描述了如何计算常量整数算术?”或“Java 中如何处理整数溢出?”