数据在内存中的存储

前言:

搭配练习一起学习,效果更佳!

1. 整数在内存中的存储

1. 整数的2进制表示方法有三种,即原码,反码,补码

2. 三种表示方法均有符号位数值位两部分,符号位都是用0表示‘正’,1表示‘负’,二进制的最高一位被当作是符号位,剩余都是数值位。

对整形来说,数据存放在内存中其实存放的是补码

正整数的原码,反码,补码相同。 

负整数的原码,反码,补码各不相同。

原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。

反码:将原码的符号位不变,其它位依次按位取反即可得到反码。

补码:反码+1就得到补码。

示例:

2.大小端字节序和字节序判断

1. 超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念。

2. 大端(存储)模式:是指数据的低位字节内容保存在内存中的高地址处,而数据的高位字节内容保存在低地址处。

3. 小端(存储)模式:是指数据的低位字节内容保存在内存中的低地址处,而数据的高位字节内容保存在高地址处。

示例:我们可以看到下图中的数字n, 数据的低位字节的内容44放在低地址地址处,数据的高位字节内容放在高地址处,由此可以知道当前机器为小端字节序存储。

为什么会有大小端模式之分? 

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8个bit位,但除了8 bit 的char之外,还有16 bit 的short 型,32 bit 的long型(要看具体的编译器),另外,对于大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然那么必然存在着一个如何将多个字节安排的问题,因此就导致了大端存储模式和小端存储模式。 

 例如:一个 16bit 的short类型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,0x22放在高地址处,ox11放在低地址处。对于小端存储模式,0x22低地址处,0x11放在高地址处。

 我们常用的X86结构是小端模式,而KEFI C51则为大端模式,很多的ACM,DSP都为小端模式。有些ACM处理器还可以由硬件来选择是大端模式还是小端模式。

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

常见的浮点数:3.14159,1E10等,浮点数家族包括:float. double. long double类型。

浮点数存储的过程: 

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示为下面的形式

V=(-1)^S *M *2^E 

1. (-1)^S表示符号位,当S为0时,V为正数,当S为1时,V为负数。

2. M表示有效数字,M时大于等于1,小于2的

3. 2^E 表示指数位

示例:5

十进制的5写成二进制是101.0,相当于1.01 * (2)^2

那么按照上面的方法,可以得到S=0,M=1.01,E=2;

V=(-1)^0 * 1.01 * 2^2;

根据IEEE754规定:

对于32位的浮点数,最高一位存储符号位S,接着的8位存储指数位M,剩下的23位存储有效数字E。

对于64位的浮点数,最高一位存储符号位S,接着的11位存储指数位M,剩下的52位存储有效数字E。

IEEE75对有效数字M和指数E,还有一些特别的规定:

对于M:

1<=M<=2,说明M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。

IEEE规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分,比如保存1.01时,只保存01,等读取数时,再把第一位的1加上。这样做的目的,节省一位有效数字。以32位32位浮点数为例,留给M的只有23位,将第一位舍去后,等于可以保留24位有效数。

 对于E:

首先E是一个无符号整数(unsigned)

这就意味着,如果E是8位,它的取值范围为0~255;如果E为11位,它的取值范围0~2047。但我们知道科学计数法中的E是可以为出现负数的,所以IEEE规定,存入数据的真实值必须加上一个中间数,对于8位的E这个中间数是127,对于11位的E这个中间数为1023,比如,2^10的E是10,所以保存为32位的浮点数时,必须保存成10+137,即10001001。

浮点数取数的过程:

指数E从内存中取出来还可以分为3种情况:

 E不全为1或不全为0

这时,浮点数就采用下面的规则表示,即指数E减去127得到真实值,有效数字前面加上第一位1。

 E全为0

这时,浮点数的指数等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位1,而是还原为0.xxxxxx的小数,这样做是为了表示+-0,以接近于0的很小的数字。

 E全为1

这时,如果有效数字M全为0,表示无穷大(正负取决于符号位)

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值