数据在内存中的存储

Part1.整形在内存中的存储

1.整形的存储方式

整形在内存中以补码的形式存储,使用补码可以将符号位和数值域统一处理;同时补码和原码可以相互转换,运算过程是相同的,不需要额外的转换

补充:正整数的原码,反码,补码是相同的了,而对于负整数来说,三种表示形式各不相同;

        原码:直接将数值按照正负数的形式翻译成二进制编码

        反码:原码中的1转换成0,0转换成1即可得到反码

        补码:将反码+1即可得到补码

2.字节存储的两种方式

字节在数据中存储的时候有两种不同的存储方式,我们将这两种不同的存储方式称为大端字节序和小端字节序。

①大端字节序

我们知道,整形数据内存的存放是从高地址向低地址存放的,高地址存放高位,低地址存放低位。而大端字节序类似,数据的低位字节存放在高地址,数据的高位字节存放在低地址

②小端字节序

存储方法类似于大端字节序,数据的低位字节存放在低地址,高位字节存放在高地址,与大端字节序的存放方式正好相反。

3.一些例子

#include <stdio.h>
int main()
{
 char a= -1;
 signed char b=-1;
 unsigned char c=-1;
 printf("a=%d,b=%d,c=%d",a,b,c);
 return 0;
}

代码运行结果如下

我们来分析一下这个代码:三个变量a,b,c其中a是一个字符型,b是一个有符号字符型,c是一个无符号字符型。在打印这三个变量的时候,我们需要注意这三个变量的范围,其中signed char的表示范围是-128-127,unsigned char的表示范围是0-255。

我们赋给a的值为-1,其原反补码如下

而char只能存8个bit位,故存放的为 11111111。%d打印的为有符号的整数,这里我们需要将其整型提升,提升为32位的补码如下。

最后我们将其转换成原码输出,故a和b的输出值为-1。

对于c这种无符号数,我们将其整形提升后的32位原,反,补码如下(无符号数的原,反,补码相同),故c的输出值为255。

Part2.浮点数在内存中的存储

其中IEEE 754规定:

对于32位的浮点数,最高的1位存储符号位S,后面8位存储指数E,剩下的23位存储有效数字M

对于64位的浮点数,最高的1位存储符号位S,后面11位存储指数E,剩下的52位存储有效数字M

①浮点数的存储过程

1.对于M

在计算机内部保存M的时候,我们默认第一位为1并将其舍去,这样可以保留更多位有效数字,等到读取的时候再把舍去的第一位的1加上。

2.对于E

E是一个无符号整数,其表示为2的指数形式,存入内存时,E的真实值必须再加上一个中间数。

②浮点数的取出过程

1.E不全为0或不全为1

指数E的计算值减去127或1023,得到真实值,再将有效数字M前加上舍去的第一位的1。

2.E全为0

指数E等于1-127或1-1023即为真实值,有效数字M不需要加上舍去的第一位的1,而是将其还原为0.×的小数。

3.E全为1

若有效数字M全为0,则表示加减无穷大,加减取决于符号位s

言尽于此,本次总结就到这里了,希望对大家有所帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值