【发布时间】:2012-07-24 06:27:17
【问题描述】:
是否有PRIu128 的行为类似于来自<inttypes.h> 的PRIu64:
printf("%" PRIu64 "\n", some_uint64_value);
或者手动逐位转换:
int print_uint128(uint128_t n) {
if (n == 0) return printf("0\n");
char str[40] = {0}; // log10(1 << 128) + '\0'
char *s = str + sizeof(str) - 1; // start at the end
while (n != 0) {
if (s == str) return -1; // never happens
*--s = "0123456789"[n % 10]; // save last digit
n /= 10; // drop it
}
return printf("%s\n", s);
}
是唯一的选择吗?
请注意,uint128_t 是我自己的 __uint128_t 的 typedef。
【问题讨论】:
-
我不会在函数中执行打印,而是返回一个字符串表示,所以我可以用它做一些事情而不是直接打印它。
-
@DanielFischer:
char str[40] = {0};已经用零填充了整个数组。 -
@Wug:是的。通常我会。这只是一个示例,以避免使用传递缓冲区的样板。
-
@KennyTM 哦,呵呵!我怎么忽略了这一点?谢谢指正。
-
小心 GCC 的
__uint128_t。它在许多平台上给我们带来了问题,比如 ARM64、ARMEL 和 S/390。我们不得不放弃使用它,因为它太麻烦了。例如,GCC 将u = 93 - 0 - 0 - 0(使用 128 位类型)的结果计算为18446744073709551615在 ARM64 上。