如何将两个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
相关产品推荐
相关产品推荐

