能不能给我讲讲C语言中实数的二进制形式,是怎样存储的?

 我来答
听不清啊
高粉答主

2021-08-11 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部

float 单精度浮点数在机内占 4 个字节,用 32 位二进制描述。

double 双精度浮点数在机内占 8 个字节,用 64 位二进制描述。

浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。

数符占 1 位二进制,表示数的正负。

指数符占 1 位二进制,表示指数的正负。

尾数表示浮点数有效数字,0.xxxxxxx, 但不存开头的 0 和点。

指数存指数的有效数字。

指数占多少位,尾数占多少位,由计算机系统决定。

可能是数符加尾数占 24 位,指数符加指数占 8 位 -- float。

数符加尾数占 48 位,指数符加指数占 16 位 -- double。

知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。

对编程人员来说,double 和 float 的区别是 double 精度高,有效数字 16 位,float 精度 7 位。但 double 消耗内存是 float 的两倍,double 的运算速度比 float 慢得多,C 语言中数学函数名称 double 和 float 不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。

类型    比特数    有效数字    数值范围

float    32    6-7    -3.4*10(-38)~3.4*10(38)    

double    64    15-16    -1.7*10(-308)~1.7*10(308)    

long double    128    18-19    -1.2*10(-4932)~1.2*10(4932)    

简单来说,Float 为单精度,内存中占 4 个字节,有效数位是 7 位(因为有正负,所以不是8位),在 VC++6.0 平台中默认显示是6位有效数字;double为 双精度,占 8 个字节,有效数位是 16 位,但在 VC++6.0 平台中默认显示同样是 6 位有效数字

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):尾数部分。

下面举例一个浮点数如何存储转换的(以float为例)


以浮点数18.75为例


首先转化为二进制即10010.11

转化为科学计数法即1.001011*2的e次方(e=4)

这个指数的值就是阶码的值,正数所以符号位为0,小数点后的为尾码,超出去部分舍掉并取整。

所以最终存储为0 10000011 0010110 00000000 00000000

同理可得-18.75的存储为1 10000011 0010110 00000000 00000000

1、float类型数字在计算机中用4个字节(32位)存储。

遵循IEEE-754格式标准:
一个浮点数由3部分组成:符号位s(1位)和、指数e(8位)、底数m(23位)

 

2、格式
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

S:符号位
E:指数,十进制指数加上127后的值得二进制数据
M:底数

 

3、符号位

指底数的符号,可正可负。

 

4、指数

占用8bit的二进制数,可表示数值范围为0-255。

但是指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数。

所以,float类型的指数可从-126到128

 

5、底数

实际是占用24bit的一个值,但是最高位始终为1,所以,最高位省去不存储,在存储中占23bit
科学计数法。

 

再举一例:
17.625在内存中的存储

首先要把17.625换算成二进制:10001.101

在将10001.101右移,直到小数点前只剩1位:
1.0001101 * 2^4  因为右移动了四位

底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为:0001101
指数:实际为4,必须加上127(转出的时候,减去127),所以为131。也就是10000011
符号:整数,所以是0


综上所述,17.625在内存中的存储格式是:
01000001 10001101 00000000 00000000

万叶爱玩游戏

2021-12-06 · 游戏领域创作者
万叶爱玩游戏
采纳数:448 获赞数:479

向TA提问 私信TA
展开全部
实数也就是小数的存储,小数的存储是IEEE754标准存储的,以C语言为例float类型占32位,double类型占64位,以float类型来说,这32位的float有1位表示小数的符号
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式