我知道这个问题已经部分回答了here on S.O.,但他们解释了什么发生在算术溢出。在S.O.的其他地方。他们在java代码中解释how to check for overflow,即阻止它作为程序员。java中的Arith溢出:为什么在运行时没有异常并且没有编译器警告?
在这里,我问为什么有在运行时没有异常,没有编译器警告?
AFAIK,这个还没有回答过。
在Bruce Eckel的书Thinking in Java,1st ed。 (2000年),第3章,还有这个小Java程序:
//: Overflow.java
// Surprise! Java lets you overflow.
public class Overflow {
public static void main(String[] args) {
int big = 0x7fffffff; // max int value
prt("big = " + big);
int bigger = big * 4;
prt("bigger = " + bigger);
}
static void prt(String s) {
System.out.println(s);
}
} ///:~
的这个输出是:
big = 2147483647 bigger = -4
,你会得到任何错误或编译器警告,并没有异常运行时为 。
没有当Integer.MAX_VALUE的是用来代替“0x7FFFFFFF的”
我曾经尝试这样做了一些Java编译从1.2到1.6,它仍然显示这种行为的改变。我现在想知道为什么这样?
- 这是一个错误?
- 这是不可能检测到的,或者是编译器设计者的一个低优先级问题?
- 由于向后兼容,这是不是固定的?
- 也许在JDK的新版本中,可以在编译时通过启用一些很少使用的编译器开关/ -D:属性或一些Java VM参数(-XX:...)来控制它吗?
刚才我用这些虚拟机时,Windows x86的32位
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)
和
Java(TM) SE Runtime Environment (build 1.7.0_03-b05)
Java HotSpot(TM) Client VM (build 22.1-b02, mixed mode, sharing)
顺便说一句,C#(Microsoft.CSharp \ v4.0_4.0.0。 0)显示相同的行为
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OverflowCheck
{
class Overflow
{
static void Main(string[] args)
{
int big = 0x7fffffff; // same behaviour vor Int32.MaxValue
prt("big = " + big);
int bigger = big * 4;
prt("bigger = " + bigger);
prt("done");
}
static void prt(String s) {
System.Console.WriteLine(s);
}
}
}
输出:
big = 2147483647
bigger = -4
在C#中,行为是可配置的,包括通过'checked'关键字:请参阅http://msdn.microsoft.com/en-us/library/74b4xzyw(v=vs.71).aspx – 2012-02-19 12:26:30