问题描述
我正在编写一个自定义的 printf
函数,而 uint64_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。是这是我遗漏的一些标准行为还是我做错了什么?
解决方法
如果 0xff00ffb7
是可变参数函数的 uint64_t
,则将其强制转换。
printf("Number is %C",(uint64_t) 0xff00ffb7);
0xff00ffb7
作为整数常量,具有 int,unsigned,long,unsigned long,long long
或 unsigned long long
类型:它“适合”的第一个。对于 32 位 int/unsigned
,0xff00ffb7
将是 unsigned
,并且可能是 OP 麻烦的根源。
将 u
附加到常量是一个好主意,以确保它是某种无符号类型。
将 L
或 LL
附加到常量并不是确保常量为 uint64_t
的好主意。要么可能匹配(LL
经常会),但这些后缀并不能保证该类型。
使用 UINT64_C(0xff00ffb7)
形成类型为 uint_least64_t
的常量,它肯定与具有 uint64_t
的机器上的 uint64_t
相同。