int a=1;printf ("%f",a);为什么输出为0?我知道是%d不是%f

发布网友 发布时间:2024-10-24 09:54

我来回答

1个回答

热心网友 时间:2024-11-13 13:36

不同的数据存储格式不一样,
正因为如此,c语言才设计了不同的格式化符号来对应识别数据并输出正确格式。
不要混用,既然知道,何苦还混用。
printf ("%f",float(a));

追问我想知道的输出为0的原理

追答

这个结果是不确定的,跟编译器和硬件有关。原则上 整数存储方式基本上 c语言通用 大序或者小序存储,只跟操作系统和处理器有关。 而浮点数没有严格规定,通常用 IEEE 754 , 我们就用IEEE 754  格式来看看。

整数a  = 1 二进制存储是 0000 0000 0000 0000 0000 0000 0000 0001

如果我们强行把他当成浮点数,那么数值变为
2^(-126) * 2^(-22) = 2.8 * 10^(-45)

然后这个还是不对,原因在于,printf只接受double类型,所以应该是对 int 看成 double来输出,因为 int 字节数 和 double 字节数不匹配,具体如何实现不太确定,不过一点可以肯定的是,这个数值非常的小。

为简单起见,我们来看如果字节数和 double 字节数相同的整型数据: 整数1,会输出4.9* 10^(-324), 如果你用 "%f"的格式输出,当然结果就是 0 了。 

long long a = 1;

printf("%g", a);

这种应该是 

2^(-1022) * 2^(-52) = 4.9* 10^(-324)

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com