剖析整数,浮点数在内存中的存储

来源:互联网 发布:惠普企业软件 编辑:程序博客网 时间:2024/05/29 17:50


一:整数在内存中的存储

 比如:

int a = 10;

int b =  -10;

a分配了4个字节的空间,那如何存储呢?


首先,明确原码,反码,补码:

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

反码:将原码符号不变。其他位一次按位取反。

补码:反码加一得到补码。

正数的原反补相同,对于整形来说:数据存放内存中其实是存放的补码。


接下来,介绍在内存中存储:


a和b分别存储得是补码,但顺序有差异。

所以要介绍大小端:

大段字节序存储:是数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中。

小段字节序存储:是指数据的低位保存在内存的低地址,中数据的高位保存在内存的高地址中。


二:浮点型在内存中的存储:

浮点数包括: float  

double

long double

根据国际标准,任意一个二进制浮点数V可以表示为下面的形式:

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

.(-1)^S表示符号位,当S=0;V是正数,反之,V是负数。

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

2^E表示指数位



例:十进制的5.0,二进制表示为101.0,相当于1.01*2^2

所以S=0,M=1.01,E=2.


规定:对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位是有效数字M;    

    对于64位的浮点数,最高的1位是符号位s,接着的11位是指数E,剩下的52位是有效数字M。

注    :如果E是一个无符号整数,但是因为科学计数法中的E是可以出现负数,

    所以存入内存中的E必须加上一个中间数,对于8位E,此数是127;对于11位E,此数为1023。


接下来E分情况:

1.E全是0,此时表示正负0;

2.E全是1.表示,表示无穷大。


举个例子:

int main()

{

float f = 5.5f;

return 0;

};


f用十进制表示为5.5,用二进制表示为101.1,也就是1.011*2^2  (E=2+127=129)

s = 0; E = 10000001 M=01100000000000000000000

表示为:01000000101100000000000000000000 







原创粉丝点击