问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言如何把浮点数转换成二进制

发布网友 发布时间:2022-04-20 03:17

我来回答

1个回答

热心网友 时间:2023-06-23 19:20

这就设计到浮点数的 表示方法了:

 

C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。

 

 

符号位(Sign) : 0代表正,1代表为负

 

指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储

 

尾数部分(Mantissa):尾数部分

 

 

 

     R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25*,而120.5可以表示为:1.205*,这些小学的知识就不用多说了吧。而我们傻蛋计算机根本不认识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,我靠,不会连这都不会转换吧?那我估计要没辙了。120.5用二进制表示为:1110110.1用二进制的科学计数法表示1000.01可以表示为1.0001*,1110110.1可以表示为1.1101101*,任何一个数都的科学计数法表示都为1.xxx*,尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127。

 

     首先看下8.25,用二进制的科学计数法表示为:1.0001*

按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示:

 

而单精度浮点数120.5的存储方式如下图所示:

 

那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值呢?其实就是对上面的反推过程,比如给出如下内存数据:0100001011101101000000000000,首先我们现将该数据分段,0 10000 0101 110 1101 0000 0000 0000 0000,在内存中的存储就为下图所示:

 

根据我们的计算方式,可以计算出,这样一组数据表示为:1.1101101*=120.5

而双精度浮点数的存储和单精度的存储大同小异,不同的是指数部分和尾数部分的位数。所以这里不再详细的介绍双精度的存储方式了,只将120.5的最后存储方式图给出,大家可以仔细想想为何是这样子的

 

下面我就这个基础知识点来解决一个我们的一个疑惑,请看下面一段程序,注意观察输出结果

            float f = 2.2f;
            double d = (double)f;
            Console.WriteLine(d.ToString("0.0000000000000"));
            f = 2.25f;
            d = (double)f;
            Console.WriteLine(d.ToString("0.0000000000000"));

 

可能输出的结果让大家疑惑不解,单精度的2.2转换为双精度后,精确到小数点后13位后变为了2.2000000476837,而单精度的2.25转换为双精度后,变为了2.2500000000000,为何2.2在转换后的数值更改了而2.25却没有更改呢?很奇怪吧?其实通过上面关于两种存储结果的介绍,我们已经大概能找到答案。首先我们看看2.25的单精度存储方式,很简单 0 1000 0001 001 0000 0000 0000 0000 0000,而2.25的双精度表示为:0 100 0000 0001 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,这样2.25在进行强制转换的时候,数值是不会变的,而我们再看看2.2呢,2.2用科学计数法表示应该为:将十进制的小数转换为二进制的小数的方法为将小数*2,取整数部分,所以0.282=0.4,所以二进制小数第一位为0.4的整数部分0,0.4×2=0.8,第二位为0,0.8*2=1.6,第三位为1,0.6×2 = 1.2,第四位为1,0.2*2=0.4,第五位为0,这样永远也不可能乘到=1.0,得到的二进制是一个无限循环的排列 00110011001100110011... ,对于单精度数据来说,尾数只能表示24bit的精度,所以2.2的float存储为:

 

但是这样存储方式,换算成十进制的值,却不会是2.2的,应为十进制在转换为二进制的时候可能会不准确,如2.2,而double类型的数据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题,对于能够用二进制表示的十进制数据,如2.25,这个误差就会不存在,所以会出现上面比较奇怪的输出结果

 

了解了浮点数的存储方式后,转成二进制应该就简单很多了,希望这点东西对你有用,望采纳!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
儿童散学归来早描述的是什么季节(儿童散学归来早描写的是什么季节) 超级死神进化论章节目录 我们没有忘记读后感458字作文 贷15万贷10年每月还多少钱 15万10年贷款月供多少 15万贷10年月供多少钱 15万贷款10年一月多少钱 贷款15万10年每月还多少 在银行贷款15万十年还清想知道利息和月供……(还望亲们提供的的2013年... 今天去刷qq空间 看到了一个同学的头像 说明他发了说说 可是怎么刷新... 商家有欺诈消费者找谁啊! 遭受商家欺骗,消费者怎样维权 被商家欺骗找什么部门 商家有欺诈行为,怎么赔偿消费者 如何投诉淘宝卖家欺骗消费者 遇到商家欺骗消费者怎么办 怎样查找自己手机位置 如何投诉京东商家欺骗消费者虚假宣传 消费者购物时遭到商家欺诈诱骗,找谁求助?110?12... 消费者被商家欺骗,怎么样来维权? 我的vivo手机丢了可能没有sim卡了或者关机了怎么能... 淘宝商家欺骗消费者怎么办,我要去哪里投诉 遇到无良商家欺骗消费者要怎么投诉了? 手机丢了如何找到位置 商家欺骗消费者可以要求几倍赔偿 如何找手机位置 淘宝商家欺骗消费者应该怎么索赔 手机丢了怎么找到手机所在位置? 如果商家欺骗消费者应该得到怎样处理 商家欺诈行为向谁举报 怎样一组浮点数转换成二进制 photoshop怎样保存图片 冰糖烤梨的功效 冰糖烤梨做法 冰糖烤梨的做法大全 香烟质量如何区分? 如何判断一支烟的好坏 冰糖烤梨的做法和配料 如何鉴别香烟的好坏? 冰糖烤梨正宗制作方法 怎么辨别香烟的好和坏? 冰糖烤梨的做法视频窍门 大家是怎么区分一支烟的好坏的? 冰糖烤梨治风热咳嗽吗? 怎样辨别好烟.? 梨烤熟了吃,有什么好处和坏处? 香烟抽起来感觉好不好,主要是从哪一方面辨别。 冰糖烤梨怎么烤表面有一层粘 怎么辨别买到的香烟是真是假? 冰糖烤梨怎么让汤稠