有符号整数乘法溢出
Signed integer multiplication with overflow
我想解决以下问题:假设我们有两个 int64_t
数字 a
和 b
。如果产品符合 int64_t
数据类型并且乘法结果的最低 64 位以其他方式计算,我们想找到 a * b
。我该如何解决这个问题?我知道使用长乘法解决 uint64_t
数据类型的类似问题,我们可以在这里应用吗?
通过纯粹的计算行为,int64_t
和 uint64_t
乘法具有相同的位模式。
因此您可以计算 1ULL * a * b
并将其分配给 uint64_t
:系数在那里强制进行 a
和 b
的类型转换。请注意,如果编译器支持 int64_t
,则还需要支持 uint64_t
。
然后就是比较这个产品cf的尺寸了。 a
和 b
看看它是否适合 int64_t
。如果乘积小于 a
和 b
.
中的任何一个(在无符号意义上),则会发生环绕
我想解决以下问题:假设我们有两个 int64_t
数字 a
和 b
。如果产品符合 int64_t
数据类型并且乘法结果的最低 64 位以其他方式计算,我们想找到 a * b
。我该如何解决这个问题?我知道使用长乘法解决 uint64_t
数据类型的类似问题,我们可以在这里应用吗?
通过纯粹的计算行为,int64_t
和 uint64_t
乘法具有相同的位模式。
因此您可以计算 1ULL * a * b
并将其分配给 uint64_t
:系数在那里强制进行 a
和 b
的类型转换。请注意,如果编译器支持 int64_t
,则还需要支持 uint64_t
。
然后就是比较这个产品cf的尺寸了。 a
和 b
看看它是否适合 int64_t
。如果乘积小于 a
和 b
.