在 Visual Studio 2012 中,如果运行下面的代码,我将得到如下所述的输出
typedef unsigned short u16;
typedef unsigned long long u64;
int main()
{
u16 i = 10;
u64 j = 1000;
printf("i= %d, j= %lu\n", i, j);
printf("j= %lu, i= %d\n", j, i);
getchar();
}
output:
i = 10, j = 1000
j = 1000, i = 0
//为什么?
最佳答案
你传递了一个 unsigned long long
(j
) 到 printf()
(8 字节)。但是,由于格式说明符不正确(%lu
应该是 %llu
),printf()
只读取了其中的一半(最低有效 4 个字节)。其他 4 个字节由 printf()
解释为 %d
(而不是被忽略的 i
)。 1000
的所有 4 个最高有效字节都是 0
。
由于值的字节数与其说明符不匹配,所以是Undefined Behaviour
.
第一个 printf()
工作正常,因为 printf()
读取的 j
的 4 个字节是最不重要的字节。在 j
中输入大于 2^32
的数字,您将在两次调用 printf()
时得到错误的结果。
关于c - 为什么在visual studio 2012中Output是这样的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41193066/