uint64_t相乘存入uint64_t异常:37×5结果为0而非185?
问题原因与解决方法
你这段代码的核心问题是输出了错误的变量:
- 你参考的拆分方案是用来计算两个
uint64_t相乘后得到的128位完整结果的,其中a_x_b_lo存储结果的低64位,multhi存储结果的高64位。 - 37×5=185,这个数值远小于2^64,它的高64位必然是0,而完整结果全部存在
a_x_b_lo里。你现在输出multhi,自然得到0。
修正后的代码
#include <iostream> #include <cstdint> int main() { uint64_t a = 37; // Input 1 uint64_t b = 5; // Input 2 uint64_t a_lo = (uint32_t)a; uint64_t a_hi = a >> 32; uint64_t b_lo = (uint32_t)b; uint64_t b_hi = b >> 32; uint64_t a_x_b_hi = a_hi * b_hi; uint64_t a_x_b_mid = a_hi * b_lo; uint64_t b_x_a_mid = b_hi * a_lo; uint64_t a_x_b_lo = a_lo * b_lo; uint64_t carry_bit = ((uint64_t)(uint32_t)a_x_b_mid + (uint64_t)(uint32_t)b_x_a_mid + (a_x_b_lo >> 32)) >> 32; uint64_t multhi = a_x_b_hi + (a_x_b_mid >> 32) + (b_x_a_mid >> 32) + carry_bit; // 输出正确的64位结果 std::cout << a_x_b_lo << std::endl; // 现在输出185,符合预期 // 可选:判断乘积是否溢出64位范围 if (multhi != 0) { std::cout << "乘积超出uint64_t存储范围" << std::endl; } }
额外说明
- 原拆分逻辑的价值在于处理乘积溢出64位的场景:当两个
uint64_t相乘结果超过64位时,能通过multhi(高64位)和a_x_b_lo(低64位)组合得到完整的128位结果;若结果未溢出,multhi为0,a_x_b_lo就是最终结果。 - 如果你不需要处理溢出场景,直接写
uint64_t result = a * b;即可,编译器会自动完成计算。
内容的提问来源于stack exchange,提问作者intrigued_66
相关产品推荐
相关产品推荐

