Printf没有打印正确的值

printf not printing the correct values

本文关键字:打印 Printf      更新时间:2023-10-16

我写了一小段c。

#include<stdio.h>
int main()
{
    int a  = 0;
    printf("Hello  World %llu is here %dn",a, 1);
    return 0;
}

打印如下输出

Hello World 4294967296 is here -1216225312

编译时带有以下警告

prog.cpp: In function ' int main() ':

prog.cpp:5:警告:格式' %llu '期望类型为' long long unsigned int ',但参数2的类型为' int '

我知道我需要将int类型强制转换为long long unsigned int,但是我不能理解为什么后面的值会损坏。

Thanks in advance

%llu需要64位整数。但是你只给了它一个32位的整数。

的效果是printf正在读取的内容相对于您传递的内容"移动"了32位。因此你的"1"没有在正确的位置被读取。

编辑:

现在来解释一下输出:

a1分开存储32位,因为它们都是32位整数。然而,printf期望第一个参数是64位整数。因此它读作a + 2^32 * 1在你的例子中是4294967296。第二个输出的值是未定义的,因为它超出了1

因为代码导致未定义行为
未定义行为本质上意味着所有的赌注都是无效的。

printf不是类型安全的。在打印类型时,您必须小心地告诉printf正确的格式描述符。

您传递给printf()的格式导致它期望堆栈上有12个字节,但您只推入了8个字节。因此,它读取了您没有推送的4个字节,并给出了意想不到的输出。

确保传递printf()期望的内容,并注意编译器的警告。

Long是64位长,因此如下所示:
1. Printf获取64位并将其作为第一个参数打印
2. 然后它在64位偏移处捕获32位,并打印它

由于您将32位值传递给第一个参数,因此两个值都是垃圾

根据给定的格式,printf读取包含a和1的64位长度的内存区域,并打印4294967296。然后它从后面的32位读取一些垃圾并打印-1216225312。