问题描述
#include <stdio.h>
int main()
{
double a=7.1;
printf("%d",a);
return 0;
}
输出:
1717986918
当我编写此程序并对方法printf()
使用带符号格式说明符时。为什么我得到这个价值?
解决方法
这是一个post问题。
使用"%d"
,编译器被告知正在打印的数据类型为int
,但是变量的类型为float
,导致format specifier,从而导致大小写为1717986918
。
类型float
的格式说明符是"%f"
,而不是"%d"
。
更改此:
printf("%d",a);
对此:
printf("%f",a);
如果您在编译器设置中使用-Wall
或同等版本进行编译,则会发出警告,通知您。
您的代码具有未定义的行为。尚未定义代码的输出内容,就任何程序员而言,代码spawns nasal demons都是如此。
为什么,我在Cprogram中得到了这个输出?
我对您的计算机和编译器实现的假设很多,例如您的编译器使用IEEE754标准表示浮点数,而int
的大小为4个字节,并且您的电脑使用小尾数法。根据{{3}},双精度数字7.1
表示为IEEE754双精度数字时,将作为0x401C666666666666
数字存储为8个字节。然后,这些字节作为可变参数传递给printf
。由于要传递体系结构参数的方式,因此将从{number}的最低有效4个字节中提取printf
%d
格式说明符,从而打印出0x66666666
数字的基数10,就是1717986918
。