C语言二进制浮点数储存方式

发布网友

我来回答

2个回答

热心网友

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

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

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

数符占 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        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数据占用 bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?不论是 float 还是 double 在存储方式上都是遵从 IEEE 的规范 的,float 遵从的是 IEEE R32.24 ,而 double 遵从的是 R.53。

无论是单精度还是双精度在存储中都分为三个部分:

下面举例一个浮点数如何存储转换的(以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

热心网友

实数也就是小数的存储,小数的存储是IEEE754标准存储的,以C语言为例float类型占32位,double类型占位,以float类型来说,这32位的float有1位表示小数的符号

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com