【问题标题】:Java Int Overflow LogicJava Int 溢出逻辑
【发布时间】:2018-09-19 13:27:26
【问题描述】:

我正在尝试在 SQL (SQL Server 2016) 中复制 Java int 上溢/下溢逻辑。逻辑是什么:

(a * b) + c

其中 a、b 和 c 的范围可以从 -2147483648 到 2147483648(SQL 中 int 的范围)

例如,在java中如果计算(135 * 12) + 2147483647,结果是-2147482029。在 SQL 中,对于 int,它会因溢出而出错。我需要在 SQL 中复制 java 上溢/下溢逻辑,所以它的工作原理相同并产生一个 int。

【问题讨论】:

  • 看看stackoverflow.com/questions/52405042/…。有什么区别吗?
  • Reproduce behavior MAX_VALUE and MIN_VALUE 请注意确定接受的答案是否有用,因为我怀疑 SQL 是否具有相同的按位运算。
  • Guava 的IntMath 类提供了类似checkedAdd 的方法,如果发生溢出则会抛出异常。
  • 为什么要将代码从 Java 移植到 SQL Server?他们通常不被认为是相似的。如果这是来自例如Oracle“Java 存储过程”,那么您可能需要考虑使用 CLR 过程,其中 C# 在这方面与 Java 具有相似的行为(尽管如果这是您的 整个 Java 部分,则不应使用 CLR '正在移植)

标签: sql sql-server math


【解决方案1】:

我想通了

declare @result bigint

set @result = ((@a* @b) + @c) % 4294967296
IF @result >= 2147483648 SET @result = @result - 4294967296
IF @result < -2147483648 SET @result = @result + 4294967296

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多