数据的存储方式

本文章仅对整型以及浮点型数据做解释。
整型家族:char, short, int, long, longlong,(包括有符号无符号类型)
浮点型家族:float,double,long double。


整型:
在计算机的内存中,数据是以二进制的补码方式存储的。
而对于整型,有三种二进制的表示方法:原码,反码,补码。
正数的原码,反码,补码,是相同的。
原码:根据数据按照正负直接写出的二进制形式。
反码:符号位不变,有效数据位按位取反得到反码。
补码:反码+1,得到补码。
为什么要有补码这个东西呢?
因为数据的运算是在CPU中进行的,而CPU只有加法器,我们可以理解为把 3-1=2 转换成3+(-1)=2;把减法转换成了加法。
总的来说 1.可以把符号位与数值域统一处理
(当负数的补码做减法或做加法依旧是负数时,有反码做调谐;当负数的补码做加法是正数时,可以通过进位的方式变成 10xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx的形式,而最高位1超出4个字节的范围,被丢掉了,则成为正数,符合题意。)
2.可以把减法和加法统一处理
3.原码变成补码,补码变成原码的运算过程是相同的,不需要额外的硬件电路
谈到整型的存储时,不得不谈到一个大小端字节序的问题。
大端字节序:数据的高地址处字节存放在低地址处,低地址处字节存放在高地址处。
小端字节序:数据的高地址处字节存放在高地址处,低地址处字节存放在低地址处。
理论上讲,当数据大小大于一个字节时,就会存在一个存放字节顺序的问题,不论怎样存都可以,只要能按照正确的方式取出来就可以,不过我们没有必要在没有必要的地方增加没有必要的难度,所以我们只留存了大端字节序和小端字节序两种存储顺序。

浮点型:
浮点型数据的范围可以在float.h的头文件中查看
浮点数在计算机中的存储规则:
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数都可以按以下规则来表示
    (-1)^S*M*2^E
(-1)表示符号位,当S为0时,这个浮点数是正数;S为1时,这个浮点数为负数。
 M表示有效数字,1<=M<2
 2^E表示指数位
举例:十进制5.0 
直接写成二进制 101.0 
写成科学计数法的形式 1.01*2^2
加上正负号,(-1)^0*1.01*2^2
此时S=0,M=1.01, E=2

对于32位的float
第一位存放S,接着的8位存放E,最后23位存放M;
对于64位的double
第一位存放S,接着的11位存放E,最后的52位存放M;

但是IEEE754对于有效数字M和指数E有一些特殊的规定

M的范围在1<=M<2,也就是说可以写成1.xxxxxxxx的形式,第一位必定是1
iEEE754规定,在计算机内部保存M时,默认第一位总是1,因此可以被舍去,只保存后面xxxxxxxx的部分,比如保存1.01时,只保存01等到读取时再把第一位的1加上去,
这样做并不是空穴来风的,可以节省1bit位,也就是说可以起到多存1位的作用。

对于E的情况就比较麻烦了
首先E是一个无符号整形。
E的存入:
然而实际情况中,是存在指数为负数的情况的,而E又是一个无符号整形,E是没有符号位的。
对于32位来说,E的取值范围时0——255,根据IEEE754规定,存入内存的E的真实值必须再加上一个中间数,对于8位的E,这个中间数127;对于11位的E,这个中间数是1023.

比如2^10的E的真实值是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001.

E的取出:
E不全为0或不全为1时:
首先将E的计算值减去127(1023)得到真实值,再将有效数字M前加上存放时舍去的第一位的1.

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值