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的方法时,不会帮助您. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |