c - 将 uint64_t 错误地传递给 va_list

标签 c variadic-functions int64

我正在编写自定义 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 or , unsigned long long:它“适合”的第一个。对于 32 位 int/unsigned0xff00ffb7 将是 unsigned 并且可能是 OP 问题的根源。

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

LLL 附加到常量并不是确保常量为 uint64_t 的好主意。 可能 匹配(LL 通常会匹配),但这些后缀不能保证该类型。

使用 UINT64_C(0xff00ffb7) 形成一个 uint_least64_t 类型的常量,它与具有 uint64_t< 的机器上的 uint64_t 相同.

关于c - 将 uint64_t 错误地传递给 va_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65568565/

相关文章:

java - 通过套接字发送字节(Java Servlet 到 C)

为脚本语言选择正确的数据类型

go - 在 Go 中转换 int 和 int64 时得到不同的输出;是由于处理器架构吗?

c - Redis添加 `dict`时地址边界错误如何解决?

c - 如何限制中断驱动的 UART 传输 PIC24H?

c - 为什么这个结构不编译?

Java 泛型可变参数方法参数

c# - 为什么要使用 params 关键字?

C++11 绑定(bind)方法签名简化

c++ - 如何输入 int64_t/uint64_t 常量?