如何解决将 uint_64_t 错误地传递给 va_list
我正在编写一个自定义的 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
相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。