uint64_t 到 va_list 的错误传递
Incorrect passing of uint64_t to 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
相同
我正在编写自定义 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
相同