返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言浮点数的二进制表示
  • 957
分享到

C语言浮点数的二进制表示

2023-06-17 13:06:27 957人浏览 薄情痞子
摘要

本篇内容介绍了“C语言浮点数的二进制表示”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!浮点数是属于有理数中某特定子集的数的数字表示,在计算机

本篇内容介绍了“C语言浮点数的二进制表示”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。

前几天,我在读一本C语言教材,有一道例题:

#include <stdio.h>  void main(void){  int num=9;  float* pFloat=&num;  printf("num的值为:%d\n",num);  printf("*pFloat的值为:%f\n",*pFloat);  *pFloat=9.0;  printf("num的值为:%d\n",num);  printf("*pFloat的值为:%f\n",*pFloat);  }

运行结果如下:

num的值为:9  *pFloat的值为:0.000000  num的值为:1091567616  *pFloat的值为:9.000000

我很惊讶,num和*pFloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?

要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。我读了一些资料,下面就是我的笔记

1、在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。

int num=9;

上面这条命令,声明了一个整数变量,类型为int,值为9(二进制写法为1001)。普通的32位计算机,用4个字节表示int变量,所以9就被保存为00000000 00000000 00000000 00001001,写成16进制就是0x00000009。

那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000?

2、根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

V = (-1)^s&times;M&times;2^E

(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

(2)M表示有效数字,大于等于1,小于2。

(3)2^E表示指数位。

举例来说,十进制的5.0,写成二进制是101.0,相当于1.01&times;2^2。那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。

十进制的-5.0,写成二进制是-101.0,相当于-1.01&times;2^2。那么,s=1,M=1.01,E=2。

IEEE 754规定,对于32位的浮点数,***的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。

C语言浮点数的二进制表示

对于64位的浮点数,***的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

C语言浮点数的二进制表示

3、IEEE 754对有效数字M和指数E,还有一些特别规定。

前面说过,1&le;M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的***位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把***位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将***位的1舍去以后,等于可以保存24位有效数字。

至于指数E,情况就比较复杂。

首先,E为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须再减去一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

然后,指数E还可以再分成三种情况:

(1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上***位的1。

(2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上***位的1,而是还原为0.xxxxxx的小数。这样做是为了表示&plusmn;0,以及接近于0的很小的数字。

(3)E全为1。这时,如果有效数字M全为0,表示&plusmn;无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。

4、好了,关于浮点数的表示规则,就说到这里。

下面,让我们回到一开始的问题:为什么0x00000009还原成浮点数,就成了0.000000?

首先,将0x00000009拆分,得到***位符号位s=0,后面8位的指数E=00000000,***23位的有效数字M=000 0000 0000 0000 0000 1001。

由于指数E全为0,所以符合上一节的第二种情况。因此,浮点数V就写成:

V=(-1)^0&times;0.00000000000000000001001&times;2^(-126)=1.001&times;2^(-146)

显然,V是一个很小的接近于0的正数,所以用十进制小数表示就是0.000000。

5、再看例题的第二部分。

请问浮点数9.0,如何用二进制表示?还原成十进制又是多少?

首先,浮点数9.0等于二进制的1001.0,即1.001&times;2^3。

那么,***位的符号位s=0,有效数字M等于001后面再加20个0,凑满23位,指数E等于3+127=130,即10000010。

所以,写成二进制形式,应该是s+E+M,即0 10000010 001 0000 0000 0000 0000 0000。这个32位的二进制数,还原成十进制,正是1091567616。

“C语言浮点数的二进制表示”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C语言浮点数的二进制表示

本文链接: https://lsjlt.com/news/289202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言浮点数的二进制表示
    本篇内容介绍了“C语言浮点数的二进制表示”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!浮点数是属于有理数中某特定子集的数的数字表示,在计算机...
    99+
    2023-06-17
  • c语言二进制怎么表示
    c语言中,二进制数用0和1表示,有两种表示方法:1. 二进制字面量,用0b或0b前缀;2. 整数转换为二进制,用%b格式说明符。c语言还提供位运算符对二进制数进行操作,包括按位与、按位或...
    99+
    2024-05-21
    c语言
  • c语言双精度浮点数如何表示
    C语言中的双精度浮点数使用 double 数据类型表示,占用 8 个字节(64 位)。其内部的表示方式遵循 IEEE 754 浮点数...
    99+
    2023-09-29
    c语言
  • 十进制浮点数的表示方法
    使用十进制浮点数,可以避免二进制浮点数与我们习惯的十进制数之间的表示误差.这个在金融领域是非常重要的.但是计算机基本都只能对二进制浮点数进行计算,也就是IEEE754格式表示的浮点数.很多程序都会自己模拟十进制浮点数的计算.为了统一,IEE...
    99+
    2023-06-03
  • c语言中浮点型怎么表示
    在C语言中,浮点型数据可以通过两种方式进行表示:1. 单精度浮点型(float):使用关键字`float`来声明单精度浮点型变量,占...
    99+
    2023-09-29
    c语言
  • c语言八进制怎么表示
    在C语言中,可以使用前缀"0"来表示一个八进制数。例如,八进制数23可以表示为023。在使用八进制数时,可以使用以下规则: 八进制...
    99+
    2023-10-26
    c语言
  • c语言中的16进制怎么表示
    c 语言中的 16 进制表示格式为:0x[十六进制数字]。常用场景包括表示颜色值、十六进制文件格式和硬件寄存器的值。需要注意,十六进制数字可以是大写或小写,但通常使用大写,并且可以包含数...
    99+
    2024-05-10
    c语言
  • C语言入门之浮点数
    目录浮点数的输出常用的库函数整数与浮点数的转换总结 实际开发中使用double,而不使用float 浮点数的输出 float采用%f占位符。 double采用%lf占位符。测试结果...
    99+
    2024-04-02
  • c语言浮点数输出的格式怎么控制
    在C语言中,可以使用printf函数来控制浮点数输出的格式。下面是一些常见的格式控制符:1. %f:输出浮点数,小数点后默认保留6位...
    99+
    2023-05-14
    c语言浮点数 c语言
  • python浮点数怎么转化为二进制
    要将Python浮点数转换为二进制,可以使用`float.hex()`方法获得浮点数的十六进制表示,然后再将十六进制字符串...
    99+
    2023-09-08
    python
  • C语言中的浮点数据类型
    目录1. 处理带小数的数值2. 浮点类型 3. 浮点类型的sizeof1. 处理带小数的数值 我们来讨论一下类似于1.234567,0.00001,这类非整数的数据。我们先试试看,i...
    99+
    2024-04-02
  • C语言怎么输出浮点数
    本篇内容主要讲解“C语言怎么输出浮点数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么输出浮点数”吧!使用 printf() 与 %f 输出浮点数...
    99+
    2023-06-17
  • C语言浮点数怎么使用
    今天小编给大家分享一下C语言浮点数怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、内存中的浮点数浮点数在内存的存储...
    99+
    2023-06-30
  • c语言浮点数如何取余
    在C语言中,可以使用fmod()函数来取两个浮点数的余数。fmod()函数的原型如下:```cdouble fmod(double ...
    99+
    2023-10-12
    c语言
  • C语言实现字符串转浮点函数的示例
      字符串不仅可以转换为整数,也可以转换为浮点数,字符串转浮点数函数原型如下: float __cdecl __mingw_strtof (const ...
    99+
    2024-04-02
  • c语言中二维数组怎么表示
    二维数组存储表格状数据,在 c 语言中声明为数组的数据类型。 初始化方式包括:1) 逐个元素初始化;2) 行级初始化;3) 使用指针。 元素访问通过行列索引。 C 语言中二维数组的表示...
    99+
    2024-05-02
    c语言
  • php如何将二进制转为浮点型数
    这篇文章主要介绍“php如何将二进制转为浮点型数”,在日常操作中,相信很多人在php如何将二进制转为浮点型数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何将二进制转为浮点型数”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • c语言二进制怎么转化为十进制
    C语言中可以使用`atoi`函数将二进制字符串转换为十进制整数。下面是一个示例:```c#include #include #inc...
    99+
    2023-09-14
    c语言
  • c语言怎么将十进制转为二进制
    本教程操作环境:windows7系统、c99版本、Dell G3电脑。c语言十进制转为二进制在C语言中,将十进制转换为其它进制时比较复杂。十进制整数转换为 N 进制整数采用“除 N 取余,逆序排列”法。具体做法是:将 N 作为除数,用十进制...
    99+
    2022-11-24
    进制转换 C语言
  • c语言如何将十进制转为二进制
    本篇内容主要讲解“c语言如何将十进制转为二进制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c语言如何将十进制转为二进制”吧!十进制转为二进制的方法:将十进制数字不断除以2直到商为零,然后将余数...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作