1.整数在内存中的存储
整数在内存中以二进制的补码的形式存储,但是正整数的原,反,补码都相同,负整数的原,反,补码各不相同。
1.有符号整数的三种表示方法均有符号位和数值位,在二进制序列中,最高位为符号位,剩余为数值位。
2.符号位0表示正,1表示负。
原码:直接将数值按正负数的形式翻译成二进制所得到的。
反码:将原码的符号位不变,其余位依次按位取反得到的。
补码:反码+1得到的。
原码,反码,补码的关系如下图所示:
2.浮点数在内存中的存储
根据国际标准IEEE754,任意一个二进制浮点数V可以表示为:
v=(-1)^s*M*2^E
1.(-1)^s表示符号位,当s=0时v为正数,当s=1时,v为负数。
2.M表示有效数字(1<=M<2)。
3.2^E指位数(2的E次方)。
eg:十进制5.5写成二进制为101.1相当于1.011*2^2,写成v的形式为v=(-1)^0*1.011*2^2。
1.IEEE754规定:
1.对于32位的浮点数(float)最高一位存储符号位s,接着8位存储指数E,剩下的23位存储有效数字M。
2.对于64位的浮点数(double)最高一位位符号位s,接着11位存储指数E,剩下的52位存储有效数字M。
2.浮点数存的过程
1.
IEEE754对有效数字M和指数E有些特殊的规则,前面说过1<=M<2,M可写为1.xxxxxx的形式,计算机在保存M时,默认这个数的第一位总是1,因此可以被舍弃,只保存小数点后面的数字,等到读取时,再把第一位的1加上去,这样做是为了节省一位有效数字,以32位为例,留给M只有23位,舍弃一位时,可以保存24位有效数字。
2.
首先E为一个无符号整数,这意味着E如果为8位,取值范围为0—255,如果为11位,取值范围为0—2047,但是,我们知道科学计数法中,E可以是负数,因此IEEE754规定,存入内存的E的真实值必须加上一个中间值,8位的E中间值位127,11位的E中间值为1023,比如2^10的E为10,保存为32位时为10+127=137,即10001001.
3.浮点数取的过程
1.E不全为0或1
这时,浮点数就采用下面的规则表示,指数E-127或1023得到真实值,再将有效数字M+1.
2.E全为0
这时,指数E等于1-127或1-1023得到的即为真实值,这是有效数字M不再加1,而是还原为0.xxxxxx的小数,这样做是为了表示正负0,以及接近0的很小的数字
3.E全为1
这时,如果有效数字M全为0,则表示正负无穷大(正负取决于s)。
3.例题
代码需要自取:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n = 9;
float* p = &n;
printf("%d\n", n);
printf("%f\n", *p);
*p = 9.0;
printf("%d\n", n);
printf("%f\n", *p);
return 0;
}
下面画图解释输出结果:
4.总结:从上面我们可以知道,整数和浮点数在内存中的存储方式是不同的。
码字不易,请留下点赞,评论和关注吧!雯雯文下次和大家再见咯!