c中的printf

#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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 9,194评论 0 2
  • 在编程中我们总要进行一些数学运算以及数字处理,尤其是浮点数的运算和处理,这篇文章主要介绍C语言下的数学库。而其他语...
    欧阳大哥2013阅读 10,792评论 0 12
  • 版权声明:本文为 gfson 原创文章,转载请注明出处。注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢...
    gfson阅读 8,696评论 0 6
  • 对于一个新兴行业来说,行业发展是非连续性进步。 对于今天的人们来说,大家越来越发现,社会的进步不是我们想象中的平滑...
    麦麦猫阅读 3,077评论 1 4
  • 开心会因为很多事,不开心也因为很多事。 左不过心情起伏。 比如前几天心情不好,就觉得哪里都不顺眼,阳光都不美好了。...
    五小六阅读 1,760评论 0 0

友情链接更多精彩内容