【发布时间】:2012-02-19 10:45:39
【问题描述】:
我知道这个问题已经部分回答了here on S.O.,但他们在那里解释了算术溢出期间发生的情况。以及 S.O. 的其他地方。他们用java代码解释how to check for overflow,即防止它作为程序员。
我在这里问为什么在运行时没有异常,也没有编译器警告?
AFAIK,以前没有人回答过这个问题。
在 Bruce Eckel 的书中Thinking in Java,第 1 版。 (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”时没有变化
我已经在从 1.2 到 1.6 的一些 java 编译器上尝试过这个,它仍然显示这种行为。我现在想知道为什么会这样?
- 这是错误还是功能?
- 这是无法检测到的,还是编译器设计人员的低优先级问题?
- 由于向后兼容性,这不是固定的吗?
- 也许在较新版本的 JDK 中,是否可以通过启用一些很少使用的编译器开关/-D:property 或一些 java VM 参数 (-XX:...) 在编译时进行控制?
刚才我用的是这些虚拟机,Windows x86 32 bit
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关键字:参见 msdn.microsoft.com/en-us/library/74b4xzyw(v=vs.71).aspx
标签: c# java overflow compiler-warnings