有符号整数乘法溢出

Signed integer multiplication with overflow

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

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

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

然后就是比较这个产品cf的尺寸了。 ab 看看它是否适合 int64_t。如果乘积小于 ab.

中的任何一个(在无符号意义上),则会发生环绕