整数和浮点数在内存中的存储
整数在内存中的存储
1.整数是以二进制的形式存储的,一个二进制位会占据一个比特位的空间。
例如:
#include<stdio.h>
int main()
{
int a = 10;//十进制的形式
//1010 二进制形式
//一个整型是四个字节,32个比特位,1010只有4个二进制位,所以我们要补0,向前补0,补齐32位
//00000000 00000000 00000000 00001010
//00000000000000000000000000001010 是以这样的形式在内存中存储的
return 0;
}
浮点数在内存中的存储
为了了解浮点数是如何在内存中存储的,我们可以先做一道题。
int main()
{
int n = 9;
float* pf = (float*)&n;
printf("%d\n", n);//?
printf("%f\n", n);//?
*pf = 9.0;
printf("%d\n", n);//?
printf("%f\n", n);//?
return 0;
}
1.浮点数的存储
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (-1)^ s * M * 2^E
(1)(-1)^s代表的是数的正负,如果S为0,则是正数,如果为1,则是负数。
(2)M是有效数字,小于2,大于等于1。
(3)E是指数位
举例说明:
5.5的二进制就是101.1
个位的5的二进制是101,小数点后面的5的二进制是1(1*2^(-1))
因此,5.5的二进制就是101.1,就相当于(-1)^0* 1.011*2^3,所以,S = 0,M = 1.011,E = 3
2.浮点数存储
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
在这里插入图片描述
2.浮点数存的过程
(1)在存储的过程中,M是需要写成1.XXXXXX的形式,但是在存储的过程中,我们只需要将小数点后面的小数位进行存储,不用存储小数点前面的1,在取数据的时候,再返回1就行了,这样可以提高数据存储的精度,32位上我们就可以存储24个有效数字了。
(2)在存储的过程中,E是一个无符号整型,8个bit位的话,大小就在0~~255之间,11个bit位的话,大小就在0~2047,但是科学计数法中,指数可以是负数的,所以,在8位时,指数是先+127后,再存储到内存中的,在取出的时候,会先将指数-127,在进行计算的。在11位时,指数是先加上中间数1023后,再存储到内存中的.
举例说明:
5.5的二进制就是101.1
个位的5的二进制是101,小数点后面的5的二进制是1(1*2^(-1))
因此,5.5的二进制就是101.1,就相当于(-1)^0* 1.011*2^3,所以,S = 0,M = 1.011,E = 3
那么在内存中存储的就是
//0 10000010 01100000000000000000000
//S E M
//注意:E = 3 + 127后,再进行存储。
3.浮点数取出
指数E从内存中取出可以分为三种情况。
(1)E不为全0或全1的情况
E-127得到真实值,再在有小数M的前面加上1.
举例说明:
0.5 二进制就是0.1 = 1.0
相当于(-1)^0* M *2^(-1)
s == 0;
M == 0;
E == -1 +127 = 126;
//0 01111110 0000000000000000000000
(2)E为全0的情况
这时,浮点数的指数的真实值就是1-127,有效数字M就不会在前面补1,而是还原为0.XXXX小数,这样的数字表示无限接近于±0的数。
0 00000000 0010000000000000000000000
(3)E为全1的情况
这时,如果有效数字为0的话,这将会时一个±无穷大的数字。
0 11111111 0010000000000000000000000
标签:存储,二进制,浮点数,有效数字,内存,127
From: https://blog.csdn.net/zxybf_/article/details/136942582