目录
1.大端存储:是指数据的低位字节内容保存在内存的高地址处,高位字节内容保存在内存的低地址处
2.小端存储:是指数据的高位字节内容保存在内存的高地址处,低位字节内容保存在内存的低地址处
大家好,曳渔又来啦!!!
希望这次的分享可以获得大家的点赞和关注
前言:
在我们编程代码时,我们经常会使用整型和浮点型,那你是不是经常思考整型和浮点型是在内存中如何存储的呢?那么这次的分享就是关于整型和浮点型在内存中是如何存储的。让我们来看看吧!!!
一:整形在内存中的存储
1.原码,反码,补码:
整形在内存中是以二进制的形式存储的(0和1),这就有了原,反,补码。
对于整型来说呢在内存中存放的就是二进制中的补码。
1):在分析整数二进制存储的时候我们也需要观察观察这个整数的类型是什么——如果整数的类型是signed(有符号)时,我们要考虑存储的二进制的最高位就是符号位了,所以要考虑是1还是0,当为1是为负号,而0为正号。而当 是unsigned时是无符号的,那么他就没有符号位。
咱们来看看例子:
2):正数:原码,反码,补码相同
3):负数:
①:原码:直接将数据按照二进制的形式进行转换就是原码
②:反码:将原码的符号位(二进制位的最高位)不变,其他位按位取反得到的就是反码
③:补码:反码+1就是补码
注意:补码可以通过取反后,+1得到原码
1):原码,反码,补码存在的意义:
这是因为呢使用补码,可以将可以将符号位和数值统一处理;并且,加法和减法也可以统 (CPU只有加法器)此外 ,补码和原码的相互转换的运算是相同的,并不需要额外的硬件处理
2):一个经典的例子:
#include<stdio.h>
#include<string.h>
int main()
{
char n[1000];
int i = 0;
for (i = 0; i <= 1000; i++)
{
n[i] = -1 - i;
}
printf("%d", strlen(n));
return 0;
}
所以答案是:
3):大小端存储:
概念:
大小端存储其实是一种存储循序的事情。
1.大端存储:是指数据的低位字节内容保存在内存的高地址处,高位字节内容保存在内存的低地址处
2.小端存储:是指数据的高位字节内容保存在内存的高地址处,低位字节内容保存在内存的低地址处
3.判断编程环境是大端还是小端:
#include<stdio.h>
int check(int* a)
{
char* p = (char*)a;
if (*p == 0x44)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int a = 0x11223344;
int ret = check(&a);
if (ret == 1)
{
printf("是小端存储\n");
}
else
{
printf("是大段存储\n");
}
return 0;
}
二:浮点型在内存中的存储
1.浮点数存储的的规则:
根据国际标准IEEE(电气和电子工程协会)754,任意⼀个二进制浮点数V可以表示成:
V = (-1)^S*M*2^E
• (-1)^S表符号位,当S=0,V为正数;当S=1,V为负数
• M表有效数字,M是大于等于1,小于2的
• 2^E表指数位
2.浮点型存储的过程:
举个例子:
取浮点数5.0,写成101.0,也就是1.01*2^2
按上式V来说:S=0,M=1.01,E=2
那么按照IEEE 754规定:
对于M:1≤M<2,所以M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表小数部分。IEEE 754规定,在保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后面的xxxxxx部分。如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。
对于E:情况有点特殊,如果E位8位,范围是0~255,如果E是11位,范围是0~2047,但是呢,在存储的时候我们的E可能出现负数,所以IEEE 745规定,存的时候必须加一个中间值,8——127,11——1023,比如5的E是2,那么加上127->2+127=129,二进制是10000001.
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)
OK 今天的关于整型和浮点型在内存中的存储到这里就完事啦。浮点数的存储比较抽象,所以可以多看几遍多加理解理解吧,那么我们就下次再见啦!!!