目录
1 整数在内存中的存储
1.1原反补的关系
原码是数值直接翻译成二进制。
反码是原码符号位不变按位取反.
补码是反码加1。
注意:只有负数的整形才有这个关系。正数的原反补都相等。
例如 int a=-2;
因为int是占四个字节,所以是32个比特位(一个字节是8个比特位)
内存中存的是补码。
如果你想从补码得到原码有两种方法:
1 把补码减1,得到反码,在符号位不变其他位按位取反。、iush
2 把补码加一,(这不是反码),符号位不变其他位安位取反。
2大小端存储
2.1什么是大小端
大小端是针对非单字节数据的存储的存取,如:int short型
大端:是将数据的高位存在低地址处,低位存在高地址处。
小端:是将数据的高位存放在高地址处,低位存在低地址处。
编译器不同数据存储可能是大端也可能是小端。
vs2022是小端存储:
从这个可以看出是 小端存储
2.2写一个程序判断是大端还是小端:
#include <stdio.h>
int check()
{
int i = 1;
int ret = *(char*)&i;
}
int main()
{
int ret = check();
if(ret == 1)
{
printf("⼩端\n");
}
else
{
printf("⼤端\n");
}
return 0;
}
因为1用16进制存储时如果是小端存储的话取出最低位的一个字节就是0,大端就是1;
所以这就可以用来区分编译器是大端还是小端。
3 浮点数在内存中的存储
在这里重点声明:浮点数的存储方式和整形的存储不同。
首先我们来看一组程序打印出来的结果是什么:
#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;
}
你猜到了吗?
3.1一些规定:
接下来就我们来讲原理:
由图看出因为M的不同,导致double和float精度不同,53个bit位的精确度的肯定要更加精确一些。
3.2浮点数存的过程
3.3浮点数取的过程:
E不全为0或不全为1
0 01111110 00000000000000000000000
E全为0
E全为1
回到题目:
#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;
}
第一个我们 n我们是按照整数的方式去存储的:
所以就是00000000 00000000 00000000 00001001
但是我们按浮点型的方式去取出来,就是s=0,M=0.00000000000000000001001,E=-126;
(这里按照的是E全为0的情况)。
算出来几乎等于0。
但是在下面一个:9.0是按照浮点型的方式去存储,就是:
OK 今天就讲到这吧。