⚙️ 工程
在 C 语言中初始化和打印 128 位整数Initialize and print 128-bit integers in C
本文解释了如何在 C 语言中处理 128 位无符号整数的初始化与输出问题。尽管标准 C 不支持原生 128 位整数类型,但可通过编译器扩展(如 GCC 的 `__uint128_t`)实现。作者强调,虽然可用 64 位值初始化 128 位变量,但更推荐使用完整的 128 位常量以确保状态完整性,尤其是在随机数生成器等关键应用中。
John
如果你仔细看我之前发的帖子,会发现我用一个64位值初始化了一个128位整数。这个128位无符号整数表示随机数生成器的内部状态。为什么不初始化为一个128位的值呢?我只是想让代码保持简单。
C编译器的特性之一,至少GCC和Clang是这样,就是无法将128位整数值直接初始化为128位整数字面量。同样,也无法直接打印128位整数,这就是为什么之前的帖子中引入了print_u128函数。
代码
__uint128_t x = 0x00112233445566778899aabbccddeeff;会产生以下错误信息。
error: integer literal is too large to be represented in any integer type问题不在于将128位数初始化为128位值;问题是编译器无法解析字面量表达式
0x00112233445566778899aabbccddeeff解决这个问题的方法是引入宏
#define U128(hi, lo) (((__uint128_t)(hi) << 64) | (lo))并用它来初始化变量。
__uint128_t x = U128(0x0011223344556677, 0x8899aabbccddeeff);你可以通过调用之前帖子中的print_u128函数来验证x是否具有预期的状态。
void print_u128(__uint128_t n)
{
printf("0x%016lx%016lx\n",
(uint64_t)(n >> 64), // upper 64 bits
(uint64_t)n); // lower 64 bits
}然后
print_u128(x);输出
0x00112233445566778899aabbccddeeff更新:上述print_u128代码在gcc下能干净地编译,但clang会给出以下警告。
warning: format specifies type 'unsigned long' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]你可以通过包含inttypes头文件并修改print_u128函数来抑制这个警告。
这是最终代码。它在gcc和clang下都能干净地编译。
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#define U128(hi, lo) (((__uint128_t)(hi) << 64) | (lo))
void print_u128(__uint128_t n)
{
printf("0x%016" PRIx64 "%016" PRIx64 "\n",
(uint64_t)(n >> 64),
(uint64_t)n);
}
int main(void)
{
__uint128_t x = U128(0x0011223344556677, 0x8899aabbccddeeff);
print_u128(x);
return 0;
}需要完整排版与评论请前往来源站点阅读。