Java如何处理整数下溢和上溢,您将如何检查它?

268

Java如何处理整数下溢和上溢?

接着上面的问题,你会如何检查/测试是否发生了这种情况?


31
很遗憾,Java不像C#那样提供对CPU的溢出标志的间接访问。 - Drew Noakes
@DrewNoakes 很遗憾,据我所知,C# 默认不使用 checked。我很少看到它被使用,而键入 checked { code; } 的工作量与调用方法差不多。 - Maarten Bodewes
3
@MaartenBodewes,您可以在编译程序集期间将其设置为默认值。 csc /checked ... 或在 Visual Studio 中的项目属性窗格中设置该属性。 - Drew Noakes
@DrewNoakes 好的,有趣。不过设置在代码之外有点奇怪。通常情况下,我希望程序的行为不受这些设置的影响(可能除了断言)。 - Maarten Bodewes
1
@MaartenBodewes,我认为这样做的原因是检查会有非常繁琐的性能开销。因此,你可以在调试版本中启用它,然后在发布版本中禁用它,就像许多其他类型的断言一样。 - Drew Noakes
@DrewNoakes 当程序员不能信任他们的输入或传感器时,这可能是无关紧要的。 - undefined
12个回答

1

有一个情况未在上文中提到:

int res = 1;
while (res != 0) {
    res *= 2;

}
System.out.println(res);

将会产生:

0

这个案例在此处讨论: 整数溢出导致为零。

1
我认为这应该没问题。
static boolean addWillOverFlow(int a, int b) {
    return (Integer.signum(a) == Integer.signum(b)) && 
            (Integer.signum(a) != Integer.signum(a+b)); 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接