3

好吧,也许我只是因为这个而累了,但我怎么能做到这一点呢?

int x = Integer.MAX_VALUE+10;

// 也许

int x = Integer.MIN_VALUE-20;

我只想让 if 语句捕获 x 是否“在范围内”有点像这样:

if(x >= Intefer.MAX_VALUE || x <= Integer.MIN_VALUE){ //throw exception}

但问题是,如果该值如上所述,如 MAX_VALUE + 10,则该值最终既不高于 MAX VALUE 也不低于 MIN_VALUE 并且不满足 if 条件......

编辑:澄清我的意思:我不想实际存储任何大于最大值/最小值的值。想象一下:

一个字段,你写 10+10,它会说“好吧,那是 20” 接下来,有人可能会写 1000000*100000,它也会回复答案,但是有人可能会写一些超过最大值/最小值的东西比如,10000000*1000000*1000000 或类似的东西,然后程序应该都是“等等,这太高了!这里是一个“0”给你”

4

4 回答 4

7

这可以通过两种方式解决:

第一种方式:

if(x + 10 <= x){ //Has wrapped arround so throw exception}

第二种方式(更好):

long x = Integer.MAX_VALUE+10L;
现在条件可以正常工作

if(x >= Integer.MAX_VALUE){ //throw exception}

于 2012-09-08T19:00:29.500 回答
6

如果您需要表示大于或小于限制的整数,请使用long而不是int变量。另一方面,如果您真的担心int包含大于 的值的变量Integer.MAX_VALUE,那么请停止担心——这样的事情是不存在的。当值存储在 中时int,任何溢出或下溢都已经发生。

于 2012-09-08T18:54:29.997 回答
2

之前提供的所有解决方案的问题在于,它们都建议向上转换为更大尺寸的原语来执行您的计算(例如使用long代替int)。

这种方法有点笨拙,当您已经在使用最大的原语时会失败。相反,您可以在执行操作之前检查操作(例如加法或减法)是否会溢出。

这是来自The CERT Oracle Secure Coding Standard for Java的一个函数,它还为其他数学运算符提供等效函数,例如减法。

static final int safeAdd(int left, int right) throws ArithmeticException {
  if (right > 0 ? left > Integer.MAX_VALUE - right
                : left < Integer.MIN_VALUE - right) {
    throw new ArithmeticException("Integer overflow");
  }
  return left + right;
}
于 2014-03-14T04:16:57.393 回答
0

Integer.MAX_VALUE和是用.表示MIN_VALUE的最大/最小值。这就是重点:你不能拥有更小或更大的值。intint

如果你想保持和测试更小或更大的值,你需要使用long.

当您尝试添加到 egInteger.MAX_VALUE并将结果保存在 anint中时,变量将溢出MAX_VALUE,结果将保持在and之间的某个值MIN_VALUE

于 2012-09-08T18:54:40.523 回答