浮点型在内存中的存储

以单精度类型变量为例
   1.国际标准IEEE(电气和电子工程协会)754,任意一个浮点数都可以表示为(-1)^S*M*2^E,其中
   (1)S表示符号位,当数据为负时S = 1,当数据为正时S = 0;
   (2)M表示有效数字位,它在内存中占据23个比特位,它的取值范围是大于等于1,小于2,而计算机对M进行存的时候只存小数点后的数据,所以程序员在进行取数据时必须给其加1,而计算机在进行存的时候必须将其小数点前的1减掉;
   (3)E代表指数位,它是一个无符号数,所以程序员将E从内存中取出时必须减去127,而将E存入内存中时必须加上127。

这里写图片描述

2.IEEE的几种特殊规定
   (1)对于E全为0的时候,取出来的数据便应该是-127,这个时候也就意味着指数为-127,而有效数字为1点几,再乘以一个2^-127,此时会是一个特别小的数据,标准规定,此时数据便是0
   (2)对于E全为1时,表示数据为无穷大(小),具体得看数据的符号位
   (3)对于不全为0或者不全为1,数据的存取遵守1
3.练习题
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int num = 9;
    float *p_float = (float*)&num;
    printf("num = %d\n", num);
    printf("*p_float = %f\n", *p_float);
    *p_float = 9.0;
    printf("num = %d\n", num);
    printf("*p_float = %f\n", *p_float);
    return 0;
}

这里写图片描述

对上述练习题的解析:
int num = 9;
在计算机内存存储形式为:0000 0000 0000 0000 0000 0000 0000 1001,此时E全为0,所有打印出来的浮点数为0
*p_float = (*float)&num;
(-1)^0*1.001*2^3
0   1000 0010   001 0000 0000 0000 0000 0000
由上比特位序列可知,打印出来的浮点数位9,整数为一个巨大的数字
3.双精度只是中间数由127变为1023,其他的都不变,这里不再做叙述
浮点型数据在内存中的存储方式是按照IEEE 754标准进行存储的。IEEE 754标准规定了两种浮点数表示方法:单精度浮点数和双精度浮点数。其中,单精度浮点数占用4个字节,双精度浮点数占用8个字节。 在IEEE 754标准中,浮点数存储格式由三部分组成:符号位、指数位和尾数位。其中,符号位用来表示浮点数的正负,指数位用来表示浮点数的数量级,尾数位用来表示浮点数的精度。 具体来说,单精度浮点数存储格式如下所示: | 31 | 30 - 23 | 22 - 0 | |----|---------|--------| | S | E | M | 其中,S表示符号位,占用1个bit;E表示指数位,占用8个bit;M表示尾数位,占用23个bit。双精度浮点数存储格式类似,只是指数位和尾数位的长度不同。 在计算机中,浮点数存储方式是按照二进制补码进行存储的。具体来说,符号位用0表示正数,用1表示负数;指数位和尾数位都用二进制补码表示。 举个例子,如果要将3.14这个单精度浮点数存储到计算机中,首先需要将3.14转换成二进制数。具体来说,可以使用以下方法进行转换: 3.14 = 11.0010001111...(二进制) 然后,根据IEEE 754标准的规定,将上述二进制数按照符号位、指数位和尾数位的顺序存储到计算机中。具体来说,可以将上述二进制数转换成以下形式: | 0 | 10000000 | 10001100100011110101110 | |---|----------|------------------------| | S | E | M | 其中,符号位S为0,表示正数;指数位E为10000000,表示指数为128(因为E需要加上一个固定的偏移量127,才能表示实际的指数值);尾数位M为10001100100011110101110,表示尾数为1.5707964(因为M需要除以2的23次方,才能表示实际的尾数值)。 因此,3.14这个单精度浮点数在计算机中的存储方式为: 01000000000100110010001111010111
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值