#include <stdio.h>
int main()
{
printf("%.1f\n", 8/6);
return 0;
}
result:
0.0
首先,8/6按数学来算是1.6,在计算机中是以 int 存储,所以结果为1。但是这里为什么是0.0?很简单,因为 printf 中用了 %.1f 格式化。看似简单的问题,实际上是因为计算机内部的原因,因为计算机内部存储数据是按照定点数和浮点数来存储的,其中定点数很简单,复杂的是浮点数的存储,具体解释可以参考 CSAPP 或者任何一本计算机组成原理的书籍。
在这里,我想记录的不是上述原因,我一开始不理解的是既然是以 float 来解释数据,但为什么当我格式化 0x7fffffff 时,结果依旧为 0.0?
int、float 在计算机内一般都是 4B,所以当我格式化一个最大的整型数字时,为什么还是 0.0,按照 IEEE 754标准来处理,自己计算的结果明显不是一个下溢数字(当作0处理)。
原来 %f 在 printf 中是以 double 来格式化的,即 8B(此处大家可以试试 printf("%.1f\n", 0x3fffffffffffffff);
输出结果为 2.0
)
具体计算机原理中数字部分的原理可以参考任何一本计算机组成原理的书籍,不想打太多字,不理解可以私信我,或者加我QQ: 1583801169