Printf没有打印正确的值
printf not printing the correct values
我写了一小段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"没有在正确的位置被读取。
编辑:现在来解释一下输出:
a
和1
分开存储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。
- Printf 命令不打印时添加了查找常见除数的新代码
- cout 打印不准确的结果,printf 打印准确的结果
- 如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
- printf 语句在调试期间未在控制台上打印
- 如何使用C 中的printf打印数字列表
- 要在不使用cout的情况下打印某些内容,请使用printf或puts()
- printf() 混淆 - 尝试打印字符串时打印 (null),打印缓冲区时打印正确的值
- C++printf打印加倍读取为0
- Printf()-打印字符限制
- 在打印相同的变量时为 cout 和 printf 获取不同的输出
- C++类型包装器 printf 打印错误的浮点值
- 带有宽度修饰符的printf无法打印该值
- 如何在c++中使用printf打印std::string数组
- 如何使用 printf 打印"%"字符
- 为什么 printf 不在这里打印
- 我可以使用 printf() 打印类的对象吗?
- 如何从java程序中打印.exe printf()消息
- 打印n个空格字符-(f)printf格式
- C++:打印数据,printf
- 比scanf和printf更有效的扫描和打印整数的方法