You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:25:27