printf不能打印正确的值
我写了一个C代码
#include<stdio.h>
int main()
{
int a = 0;
printf("Hello World %llu is here %dn",a, 1);
return 0;
}
它正在打印下面的输出
Hello World 4294967296在这里-1216225312
在编译时出现以下警告
prog.cpp:在函数'int main()'中:
prog.cpp:5:warning:格式'%llu'期望输入'long long unsigned int',但参数2的类型为'int'
我知道我需要将int转换为long long unsigned int,但我无法理解为什么后面的值被损坏的事实。
提前致谢
%llu期望一个64位整数。 但你只给了它一个32位整数。
结果是,printf正在读取的内容相对于您所传递的数据“移位”了32位。 因此,您的“1”没有在正确的位置被读取。
编辑:
现在来解释输出:
a
和1
相隔32位,因为它们都是32位整数。 但是,printf期望第一个参数是64位整数。 因此,它读取它为a + 2^32 * 1
这是你的情况4294967296
。 打印的第二个值未定义,因为它已经过了1
。
由于代码导致未定义的行为 。
一个未定义的行为本质上意味着所有的投注都关闭。
printf
不安全。 在打印类型时,您必须小心地告诉printf
正确的格式desrciptor。
您传递给printf()
的格式导致它期望在堆栈上有12个字节,但是只能推送8个字节。 因此,它会读取您未推送的4个字节,并为您提供意想不到的输出。
确保你传递了printf()
期望的,并注意你的编译器的警告。