繁体   English   中英

printf没有打印正确的值

[英]printf not printing the correct values

我写了一个C的小代码。

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

它正在打印以下输出

Hello World 4294967296在这里-1216225312

编译时出现以下警告

prog.cpp:在函数'int main()'中:

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

我知道我需要将int转换为long long unsigned int,但我无法理解为什么后来的值被破坏了。

提前致谢

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

结果是printf正在读取的内容相对于你传递的内容被“移位”了32位。 因此,您的“1”未在正确的位置读取。

编辑:

现在解释一下输出:

a1分开存储32位,因为它们都是32位整数。 但是,printf期望第一个参数是64位整数。 因此它将其读作a + 2^32 * 1 ,在您的情况下为4294967296 打印的第二个值是未定义的,因为它超过了1

因为代码导致未定义的行为
未定义的行为本身就意味着所有赌注都已关闭。

printf不是类型安全的。 打印出类型时,你必须小心告诉printf正确的格式desrciptor。

传递给printf()的格式导致它在堆栈上需要12个字节,但是你只需要推送8个字节。 因此,它会读取您未推送的4个字节,并为您提供意外的输出。

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

long long是64位长,因此会发生什么:
1. printf抓取64位并将其打印为第一个参数
2.然后它以64位的偏移量抓取32位,并打印出来

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM