首页 > 解决方案 > uint64_t 到 va_list 的错误传递

问题描述

我正在编写一个自定义printf函数,并且 auint64_t似乎被错误地传递给va_list

问题点:

printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);

我的部分printf实现产生了不正确的结果:

format++;
uint64_t num = va_arg(parameters, uint64_t);

当使用 gdb 进行调试时,值num变为0xffffffffff00ffb7而不是0xff00ffb7我期望的值,而下一个%C num变为 0。这是我缺少的一些标准行为还是我做错了什么?

标签: cvariadic-functionsint64

解决方案


如果0xff00ffb7uint64_t用于可变参数函数的,则将其强制转换。

printf("Number is %C", (uint64_t) 0xff00ffb7);

0xff00ffb7, 作为一个整数常量,具有int, unsigned, long, unsigned long, long longor ,的类型unsigned long long:它“适合”的第一个。使用 32-bit int/unsigned0xff00ffb7将是unsigned并且可能是 OP 麻烦的根源。

附加u到常量是一个主意,以确保它是某种无符号类型。

L将or附加LL到一个常量并不是一个好主意,以确保一个常量是uint64_t。两者都可能匹配(LL经常匹配),但这些后缀并不能保证该类型。

使用UINT64_C(0xff00ffb7)形成一个类型的常量,uint_least64_t这肯定与uint64_t具有uint64_t.


推荐阅读