#include <stdio.h>
int main()
{
double a=7.1;
printf("%d",a);
return 0;
}
输出:
1717986918
当我编写这个程序并使用签名格式说明符到方法printf()
时。为什么我得到这个值?
这是一个格式说明符问题
使用"%d"
,编译器被告知要打印的数据类型为int
类型,但变量为float
类型,从而导致未定义的行为,在这种情况下产生值1717986918
。
类型float
的格式说明符是"%f"
,而不是"%d"
。
更改此项:
printf("%d",a);
对此:
printf("%f",a);
如果您在编译器设置中使用-Wall
或等效工具进行编译,则会发出警告。
您的代码有未定义的行为。它没有定义你的代码输出应该是什么,对于任何程序员来说,你的代码都会滋生鼻恶魔。
为什么我在我的Cprogram中得到这个输出?
我假设很多关于您的计算机和编译器实现的信息,例如您的编译器使用IEEE754标准来表示浮点数,int
的大小为4字节,并且您的计算机使用小端序。根据该站点,当表示为IEEE754双精度数时的双精度数7.1
被存储为8字节作为0x401C666666666666
数。然后将这些字节作为变参数传递给printf
。由于架构参数的传递方式,从该数字中提取最低有效的4个字节用于printf
%d
格式说明符,这将导致打印0x66666666
数字的基10表示,即1717986918
。