当前位置: 首页 > 知识库问答 >
问题:

如何防止Java代码中的整数溢出?[副本]

田彬郁
2023-03-14

可能重复:
如何检查在Java中相乘两个数字是否会导致溢出?

假设我有一个Java类方法,它使用*操作。

int foo(int a, int b) {
  ... // some calculations with + and * 
}

如何确保foo中没有发生溢出?

我想我可以使用BigDecimal,也可以用“包装器”替换all and*,比如:

int sum(int a, int b) {
   int c = a + b;
   if (a > 0 && b > 0 && c < 0) 
     throw new MyOverfowException(a, b)
   return c;
}

int prod(int a, int b) {
   int c = a * b;
   if (a > 0 && b > 0 && c < 0) 
     throw new MyOverfowException(a, b)
   return c;
}

有没有更好的方法来确保Java方法中不会发生int溢出?

共有3个答案

澹台权
2023-03-14

总和:检查b是否大于可以存储在int中的最大值减去a的值的差值。如果a和/或b可以为负数,则必须(i)小心不要在差值检查中溢出,并且(ii)对最小值执行类似检查。

产品:这更难。我会将整数拆分为两个半长整数(即,如果int为32位,则使用位掩蔽和移位将其拆分为两个16位数字)。然后进行乘法运算,然后查看结果是否符合32位。

在您不想简单地获取临时结果的情况下的所有内容。

颛孙炜
2023-03-14

从工程角度来看,这是一个难题。

安全编码网站建议:

  • 先决条件的使用;i、 e.范围检查输入,以防止溢出,

Dobbs博士的这篇文章建议创建一个基本算术方法库,用显式溢出检查执行每个基本操作。(您可以将其视为上述要点2的实现。)但作者进一步建议使用字节码重写,用对包含溢出检查的等效方法的调用来代替算术字节码。

不幸的是,没有办法在Java中本地启用溢出检查。(但这同样适用于许多其他语言;例如C、C...)

长孙高远
2023-03-14

检查溢出的一种方法是将操作数升级为更大的类型(是原始操作数位长度的两倍),然后执行该操作,然后查看结果值对于原始类型是否太大,例如。

int sum(int a, int b) {
    long r = (long)a + b;
    if (r >>> 32 != 0) {    // no sign extension
        throw new MyOverflowException(a, b);
    }
    return (int)r;
}

如果您的原始类型是long,则必须使用BigIntger作为较大的类型。

 类似资料:
  • JSFIDLE 如何阻止flexbox的子项溢出容器? 我不希望溢出设置为隐藏 超文本标记语言: CSS:

  • 我试图获取代码,以防止用户输入中包含数字。 基本上,我希望代码如下所示: 请求输入 关键是(为什么这不是一个重复的问题):我不能使用循环或其他我们还没有学会的语句。到目前为止,我们所学的唯一真正的语句是if/else/else if语句。这意味着我不能像一些答案所建议的那样使用for循环。虽然它们是很好的答案,而且很有效,但我会因为使用它们而失分。 我已经有了这个,但我不知道如何测试输入是否只包含

  • 我在一次采访中被问及这一点。我被要求计算数字x1,x2,x3,…的平均值,。。。xn公司 //所以归结起来是这样的: 面试官说列表的大小是未知的,它可能很大,所以总和可能会溢出。他问我如何解决溢出问题,我的回答是跟踪我们可能超过最大数量的次数等等,他说了一些关于推入堆栈、平均值和长度的事情,我从来没有真正理解他的解决方案,将这两个变量推入某种列表中?有人知道吗?

  • 我有以下的布局在脑海中的一个列表。每个列表项由两列表示。第二列应该占用所有可用空间,但是如果第一列占用太多空间,它应该以最小大小固定在右边。然后,第一列应显示省略号。 问题发生在最后一个案例中。当第一列包含太多文本时,它不会显示省略号,而是将自身从flexbox中伸出,从而显示水平滚动条,而第二列不会定位到右侧。 我想让它呈现如下(模型): 我怎样才能做到这一点? 这是提琴样品。

  • 问题内容: 如果使用此代码,则div的圆角不会剪切图像(结果是图像的方形角覆盖了div的圆角): 有谁知道如何获得一个圆形的div来防止子图像溢出? 问题答案: 这可能会或可能不会在您遇到的情况下起作用,但请考虑使图像成为CSS背景。在FF3中,以下工作正常: 我不确定还有另一种解决方法-如果您对图像本身应用边框(例如,较深),则会遇到同样的方形角问题。 编辑: 尽管在“为图像添加边框”情况下,图

  • 在我的C代码中,我有: 我确信最终结果不会导致整数溢出,但这并不能保证(a b) 以下是我的错误信息: 第20行:Char 27:运行时错误:有符号整数溢出:1063376696 2126753390不能在类型'int'(solution.cpp)中表示摘要:未定义行为清理器:未定义行为prog_joined.cpp:31: 27 我如何解决这类问题?