【问题标题】:Signed integer multiplication with overflow带溢出的有符号整数乘法
【发布时间】:2020-03-27 04:00:31
【问题描述】:

我想解决以下问题:假设我们有两个int64_t 数字ab。如果乘积符合int64_t 数据类型和其他方式的最低64 位乘法结果,我们希望找到a * b。我该如何解决这个问题?我知道uint64_t数据类型使用长乘法的类似问题的解决方案,我们可以在这里应用它吗?

【问题讨论】:

  • 您的编译器是否支持 128 位整数作为扩展?
  • 可以,但我不应该使用它
  • 它与if(INT64_MAX / a > b) overflow = true; 类似。您还必须考虑负数和INT64_MIN

标签: c integer long-integer integer-overflow


【解决方案1】:

通过纯粹的计算恶魔行为,int64_tuint64_t 乘法具有相同的位模式。

因此,您可以计算1ULL * a * b 并将其分配给uint64_t:系数用于强制ab 的类型转换。请注意,如果编译器支持int64_t,那么它也需要支持uint64_t

然后就是比较这个产品的尺寸了。 ab 看看它是否适合 int64_t。如果乘积小于ab 中的任何一个(在无符号意义上),则会发生环绕。

【讨论】:

  • 但我也想找到正确产品的最低位
  • @envygrunt:将正确报告最低有效位。
  • 哦,好吧。生病尝试实现这一点
  • 理论上ULL不必对应64位。使用UINT64_C(1) 会更正确,但这给出了uint_least64_t,所以它也不完全正确。因此,最好的解决方案是简单地转换为uint64_t
  • 只是一个迂腐的评论 - 不将 unsigned long long 设置为 64 位似乎很疯狂。
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2013-06-02
  • 1970-01-01
  • 2020-06-12
  • 2012-02-29
相关资源
最近更新 更多