我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

c语言二进制怎么表示

c语言中,二进制数用0和1表示,有两种表示方法:1. 二进制字面量,用0b或0b前缀;2. 整数转换为二进制,用%b格式说明符。c语言还提供位运算符对二进制数进行操作,包括按位与、按位或、按位异或、按位非、左移和右移。C 语言中二进制的表示
c语言二进制怎么表示
2024-05-21

c语言双精度浮点数如何表示

C语言中的双精度浮点数使用 double 数据类型表示,占用 8 个字节(64 位)。其内部的表示方式遵循 IEEE 754 浮点数标准。具体来说,双精度浮点数分为三个部分:符号位、指数位和尾数位。1. 符号位:占用 1 个位,用于表示数值
2023-09-29

十进制浮点数的表示方法

使用十进制浮点数,可以避免二进制浮点数与我们习惯的十进制数之间的表示误差.这个在金融领域是非常重要的.但是计算机基本都只能对二进制浮点数进行计算,也就是IEEE754格式表示的浮点数.很多程序都会自己模拟十进制浮点数的计算.为了统一,IEE
2023-06-03

c语言中浮点型怎么表示

在C语言中,浮点型数据可以通过两种方式进行表示:1. 单精度浮点型(float):使用关键字`float`来声明单精度浮点型变量,占用4个字节的内存空间,可以表示大约6-7位有效数字。例如:```cfloat num = 3.14;```2
2023-09-29

c语言八进制怎么表示

在C语言中,可以使用前缀"0"来表示一个八进制数。例如,八进制数23可以表示为023。在使用八进制数时,可以使用以下规则:八进制数的每一位的有效范围是0-7。如果八进制数超出了有效范围,编译器将报错。八进制数可以进行算术运算,包括加法、
2023-10-26

c语言中的16进制怎么表示

c 语言中的 16 进制表示格式为:0x[十六进制数字]。常用场景包括表示颜色值、十六进制文件格式和硬件寄存器的值。需要注意,十六进制数字可以是大写或小写,但通常使用大写,并且可以包含数字和字母 a-f。C 语言中的 16 进制表示在 C
c语言中的16进制怎么表示
2024-05-10

c语言浮点数输出的格式怎么控制

在C语言中,可以使用printf函数来控制浮点数输出的格式。下面是一些常见的格式控制符:1. %f:输出浮点数,小数点后默认保留6位。2. %.nf:输出浮点数,保留n位小数。3. %e或%E:使用科学计数法输出浮点数。4. %g或%G:根
2023-05-14

c语言中二维数组怎么表示

二维数组存储表格状数据,在 c 语言中声明为数组的数据类型。 初始化方式包括:1) 逐个元素初始化;2) 行级初始化;3) 使用指针。 元素访问通过行列索引。C 语言中二维数组的表示二维数组用于表示具有行和列维度的表格状数据结构。在 C
c语言中二维数组怎么表示
2024-05-02

c语言二级指针怎么表示二维数组

在C语言中,可以使用二级指针来表示二维数组。二维数组是由多个一维数组组成的,而一维数组可以用指针来表示。因此,二级指针可以用来表示二维数组。下面是一个示例代码,展示了如何使用二级指针来表示二维数组:#include i
c语言二级指针怎么表示二维数组
2024-02-29

c语言二维数组指针如何表示

在C语言中,可以使用指向二维数组的指针来表示二维数组。假设有一个二维数组arr,声明并初始化如下:int arr[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};可以定义一个指
2023-10-27

C语言实现十六进制与二进制的相互转换

这篇文章主要为大家详细介绍了如何利用c语言实现将文件中十六进制数据与二进制数据相互转换,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以学习一下
2022-11-13

c语言怎么以二进制形式存储数据

在C语言中,可以使用二进制形式存储数据的方法是使用位操作符。以下是一些常用的位操作符:按位与(&):将两个数的对应位进行与操作,结果中的每一位要么为0,要么为1。按位或(|):将两个数的对应位进行或操作,结果中的每一位要么为0,要么为1。
c语言怎么以二进制形式存储数据
2024-04-09

c语言二维字符数组指针如何表示

C语言中,可以通过使用指针数组来表示二维字符数组。指针数组是一个数组,其元素都是指针。对于一个二维字符数组,可以使用指针数组表示每一行,然后使用指针数组的指针来表示整个二维字符数组。下面是一个示例代码:c#include int main(
2023-10-20

C语言浮点函数中的modf和fmod怎么用

这篇文章给大家分享的是有关C语言浮点函数中的modf和fmod怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。modf函数可以提取出浮点数的整数部分和小数部分。fmod函数可以返回两个浮点数相除的余数。它们的
2023-06-29

Go语言实现二进制与十进制互转的示例代码

这篇文章主要和大家详细介绍了Go语言中实现二进制与十进制互相转换的示例代码,文中的代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
2023-05-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录