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

如何将两个UINT64表示的128位数字转为十进制并输出?

用C++输出双UINT64组成的128位十进制数

方法一:利用编译器内置128位类型(推荐)

因为无需考虑可移植性,直接用GCC/Clang支持的__uint128_t类型,把两个UINT64拼接成128位整数,再手动实现输出函数(标准库IO默认不支持__uint128_t)。

代码示例:

#include <cstdint>
#include <iostream>

void print_uint128(__uint128_t num) {
    if (num == 0) {
        std::cout << "0";
        return;
    }
    char buf[40]; // 128位最大十进制是39位,缓冲区足够
    char* ptr = buf + 39;
    *ptr = '\0';
    // 从低位到高位拆解数字,存入缓冲区
    while (num > 0) {
        *--ptr = '0' + (num % 10);
        num /= 10;
    }
    std::cout << ptr;
}

int main() {
    uint64_t high = 0x0000000000000001;
    uint64_t low = 0x1000000000000001;
    // 拼接高、低64位为128位整数
    __uint128_t num = (__uint128_t)high << 64 | low;
    print_uint128(num);
    std::cout << std::endl;
    return 0;
}

运行后会输出预期的18446744073709551618,这个方法代码简洁,效率远高于手动大数运算。

方法二:手动实现大数十进制转换

如果不想依赖编译器内置类型,可以用数组模拟大数运算,把128位数字转换成十进制数组后输出:

代码示例:

#include <cstdint>
#include <iostream>
#include <cstring>

void print_uint128(uint64_t high, uint64_t low) {
    char digits[40] = {0}; // 存储十进制每一位(低位在前)
    int len = 0;

    // 先把高64位转成十进制数组
    uint64_t temp = high;
    if (temp != 0) {
        while (temp > 0) {
            digits[len++] = temp % 10;
            temp /= 10;
        }
    } else {
        len = 1; // 高64位为0时,保留一位0
    }

    // 将数组整体乘以2^64(对应高64位的权重)
    const uint64_t multiplier = 1ULL << 64;
    uint64_t carry = 0;
    for (int i = 0; i < len; ++i) {
        uint64_t product = (uint64_t)digits[i] * multiplier + carry;
        digits[i] = product % 10;
        carry = product / 10;
    }
    // 处理乘法后的剩余进位
    while (carry > 0) {
        digits[len++] = carry % 10;
        carry /= 10;
    }

    // 加上低64位的十进制值
    temp = low;
    carry = 0;
    int i = 0;
    while (temp > 0 || carry > 0) {
        uint64_t sum = digits[i] + (temp % 10) + carry;
        digits[i] = sum % 10;
        carry = sum / 10;
        temp /= 10;
        if (i >= len - 1 && (temp > 0 || carry > 0)) {
            len++;
        }
        i++;
    }

    // 从高位到低位输出数组
    for (int i = len - 1; i >= 0; --i) {
        std::cout << (char)('0' + digits[i]);
    }
}

int main() {
    uint64_t a = 0x0000000000000001;
    uint64_t b = 0x1000000000000001;
    print_uint128(a, b);
    std::cout << std::endl;
    return 0;
}

这个方法的核心是用数组模拟十进制大数的乘法和加法,完全不依赖编译器扩展,适合需要手动控制每一步的场景。

内容的提问来源于stack exchange,提问作者bus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:20:36