引言
有关整数和浮点数在内存中存储的相关内容,如有错误,还请指正。
整数
我们知道,一个数在计算机内部是由二进制进行存储的,如十进制的4,内存中是000...(省略多个0)0100,整数在计算机中的二进制编码有三种:原码、反码和补码,这三者都分为两部分,及第一位+后31位,前者称为符号位,后者称为数值位,0为正,1为负。而在计算机内存中,数据存放的其实都是二进制的补码。
正数
对于正数来说,它的原码、反码、补码均相同,也就是说,无需考虑其相关转换。
负数
原码:直接将数值按照正负数的形式转化为二进制得到的一串数字即为原码;
反码:相对于原码来说,不对其符号位处理,将其他位依次取反得到;
补码:反码+1,逢二即往前进;
为何用补码存放的原因
使用补码能够将符号位以及数值域统一处理,因为补码是反码+1的结果,这种方法无需考虑符号位,此外,由于cpu内部只有加法处理器,如此处理能够简化电路设计,同时也提高了运算效率。
浮点数
在了解浮点数存储之前,可以先看四个例子
#include<stdio.h>
int main()
{
int n=9;
float *pFloat=(float*)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat=9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}
执行程序后,四个结果为9/0.000000/1091567616/9.000000,接下来讲述浮点数的存储。
根据国际标准IEEE754,任意一个二进制浮点数可表示为(-1)^S*M*2^E,第一位为符号位,M为有效数字,大于等于1小于2,最后2^E表示指数位,例如5.0,表示为1.01*2^2,由二进制是101.0进行转化得到。
不同位数的浮点数的不同规定
对于32位浮点数,最高一位存储符号位S,接着八位存储指数E,最后23位存储M;对于64位浮点数,最高一位是S,接着11位是E,剩下52位为M,在前面提过,1<=M<2,即1.xxx的形式,在存储中,默认这个数第一位是1,可以舍去,例如1.01仅保存01,读取时加上一个1即可。
对于E,如果为八位,范围为0~255,如果为11位,范围为0~2047,由于在科学计数法中E可以为负数,所以存入内存时,E的真实值必须再加上一个中间数,对八位,这个数是127,对11位,这个数是1023。
浮点数取的过程
取出时,将E的值减去中间值,再将M前补上1,即取出原值
1.E全为0
此时E等于1-127,这个指数是一个非常非常小的负数,而这时,这个数是一个非常接近0的数字
2.E全为1
此时,E的数值非常大,若M全为0,则表示±无穷大的值
结语
相信有一定了解过后,能够解决上述引出的四个问题
感谢观看