c - 为什么在visual studio 2012中Output是这样的

标签 c

在 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/

相关文章:

c - 尝试解析一个简单的字符串并逐字打印,得到总线错误 : 10

c - 定义一个返回函数指针的函数,该函数指针也返回一个没有 typedef 的函数指针

c - : sending UDP packet using Sendto() got "message too long"如何解决

c - gettimeofday 的时间未按应有的方式更新

c - UDP:每 x 秒从客户端读取一个新帧

c - 编译器如何在基本 ANSI C 类型和所选处理器之间建立链接

c - 什么是 servaddr.sin_addr.s_addr=INADDR_ANY

c - 如何在没有编译器的计算机上运行c语言编写的程序

c - 从内存中删除敏感信息

c - C 中的嵌套结构和取消引用指针