c - 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。这是我缺少的一些标准行为还是我做错了什么?
解决方案
如果0xff00ffb7
是uint64_t
用于可变参数函数的,则将其强制转换。
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
, 作为一个整数常量,具有int, unsigned, long, unsigned long, long long
or ,的类型unsigned long long
:它“适合”的第一个。使用 32-bit int/unsigned
,0xff00ffb7
将是unsigned
并且可能是 OP 麻烦的根源。
附加u
到常量是一个好主意,以确保它是某种无符号类型。
L
将or附加LL
到一个常量并不是一个好主意,以确保一个常量是uint64_t
。两者都可能匹配(LL
经常匹配),但这些后缀并不能保证该类型。
使用UINT64_C(0xff00ffb7)
形成一个类型的常量,uint_least64_t
这肯定与uint64_t
具有uint64_t
.
推荐阅读
- nginx - 使用 QUERY_STRING 将 .htaccess 转换为 nginx
- android - 如何在代码中检查我的设备是否支持连接的最大蓝牙?
- json - 为什么某些变量为零?
- sql - 带有子查询的无效标识符
- php - 绕过 HTML 实体
- powerbi - 影响度量的非活动关系
- firebase - Flutter Firebase - 如果用户已被禁用/删除,则流式监听
- r - 在 Jupyter 笔记本中直接在 R 中绘制临床研究主题流程图
- javascript - 如何在一页上启用多个 javascript 幻灯片?
- php - 如何在使用 laravel 提交的表单上修复页面重新加载相同的问题