加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 常见的做法如何处理整数溢出?

发布时间:2020-12-16 21:31:51 所属栏目:安全 来源:网络整理
导读:从应用程序开发团队的角度来看,处理像999999 * 999999(result Integer.MAX_VALUE)的整数溢出的常见做法是什么? 人们可以使BigInt成为强制性的,禁止使用整数,但这是一个好/坏主意? 解决方法 如果整数不溢出是非常重要的,您可以定义自己的溢出操作,例如: de
从应用程序开发团队的角度来看,处理像999999 * 999999(result> Integer.MAX_VALUE)的整数溢出的常见做法是什么?

人们可以使BigInt成为强制性的,禁止使用整数,但这是一个好/坏主意?

解决方法

如果整数不溢出是非常重要的,您可以定义自己的溢出操作,例如:

def +?+(i: Int,j: Int) = {
  val ans = i.toLong + j.toLong
  if (ans < Int.MinValue || ans > Int.MaxValue) {
    throw new ArithmeticException("Int out of bounds")
  }
  ans.toInt
}

您可能可以使用rich-your-library模式将其转化为运算符;如果JVM设法正确地进行逃逸分析,那么你不会得到太多的惩罚:

class SafePlusInt(i: Int) {
  def +?+(j: Int) = { /* as before,except without i param */ }
}
implicit def int_can_be_safe(i: Int) = new SafePlusInt(i)

例如:

scala> 1000000000 +?+ 1000000000
res0: Int = 2000000000

scala> 2000000000 +?+ 2000000000
java.lang.ArithmeticException: Int out of bounds
    at SafePlusInt.$plus$qmark$plus(<console>:12)
    ...

如果不是很重要,那么在大多数情况下,标准单元测试和代码审查等都应该解决问题.使用BigInt是可能的,但会降低算术运算速度降低100左右,当您必须使用现有的采用Int的方法时,不会帮助您.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读