一.整数在内存中的存储
整数的2进制表示方法有三种,原码、反码和补码。
正数的原反补都相同,负数的反码是在原码除了符号位的剩余位取反,补码在反码的基础上加1。
对于整型来说,内存中存储的其实是补码。计算中使用的也是。超过一个字节的存储,就存在存储顺序的问题,接下来我们就来介绍一下大小端字节存储。
1.大端字节序和小端字节序
1.大端存储模式:数据的低位字节内容保存在内存的高地址处,高位字节内容保存在低地址处,也就是正着存。
2.小端存储模式:数据的低位字节内容保存在内存的低地址处,高位字节内容保存在高地址处,也就是倒着存。
例如 int a=0x11223344
大端存储的就是 11 22 33 44,小端存储的是 44 33 22 11.
常用的x86是小端模式,而KEIL C51为大端模式。很多ARM,DSP都为小端模式,有些ARM处理器可以由硬件来选择大小端模式。
2.设计程序判断当前机器的字节序
1在内存中存储应该是00 00 00 01,访问第一个字节空间,如果是10 00 00 00(小端),则访问的结果就是1。
//方法一
#include<stdio.h>
int check()
{
int i=1;
return (*(char*)&i)
}//只访问i的最低位字节
//方法二
int Test()
{
union un
{
int i;
char c;
}un;
un.i = 1;
return un.c;
}
int main()
{
int ret=check();
if(ret==1)
printf("是小端\n");
else
printf("是大端\n");
return 0;
}
二.浮点数在内存中的存储
V =(-1)^S *M * 2^E
任意一个浮点数可以表示成以上的形式
其中(-1)^s表示符号位,当S=0,V为正数;S=1,V为负数。
1)存储M时需要注意的问题
M表示有效数字,M是大于等于1,小于2的。
因为计算机默认这个数的第一位是1,所以存储过程中可以把1舍去,只保留后面的小数部分。等到读取的时候再把1加上去。这样可以节省一位有效数字,以32为浮点数为例,留给M只有23位,相当于可以保留24位有效数字。
2)存储E时需要注意的问题
2^E表示指数位。
E是一个无符号整数,E为八位,取值范围0~255,11位0~2047。但是科学计数法中E是可以出现负数的,所以再存入内存中时E的真实值必须再加上一个中间数。对于八位的,中间数为127,对于11位的,中间数是1023。
例如十进制的5.5 转换为二进制为101.1,也就可以写成(-1)^0 * 1.011* 2^2
S=0,M=1.011,E=2.
3) E取出的三种情况
i))E不全为0或不全为1
E的计算值减去127(或1023)得到真实值,再将有效数字M前加上第一位的1。
ii)E全为0
此时浮点数的指数E等于1-127或者1-1023,有效数字不再加上1,而是还原为0.XXXXX的小数。表示+-0,以及接近于0的很小数字。
iii)E全为1
有效数字M全为0,表示+-无穷大。
2万+

被折叠的 条评论
为什么被折叠?



