【发布时间】:2016-10-20 05:34:00
【问题描述】:
为什么下面代码中的第一个f() 调用最终会打印出我作为4294967294 传递给它的-2?
#include <stdio.h>
#include <stdint.h>
#include <stdarg.h>
#include <stdlib.h>
void f(int64_t i, ...)
{
va_list ap;
int64_t j;
va_start(ap, i);
j = va_arg(ap, int64_t);
printf("%jd %jd\n", (intmax_t) i, (intmax_t) j);
va_end(ap);
}
int main()
{
f(-1, -2); // Prints -1 4294967294 (bug!)
f(-1, (int64_t) -2); // Prints -1 -2 (fix!)
return 0;
}
我可以理解为什么带有修复程序的第二个f() 调用有效。但是我不明白为什么第一个f() 调用会导致这个问题。你能解释一下这种行为吗?
【问题讨论】:
标签: c variadic-functions signed unsigned-integer integer-promotion