整形和浮点数在内存中存储

文章详细解释了整形(包括short、int等)在内存中的补码存储方式,区分了大小端存储的概念,并深入剖析了浮点数(如float、double)的IEEE754标准存储格式,展示了如何理解和计算浮点数在内存中的实际表示。
摘要由CSDN通过智能技术生成

1、整形在内存的存储:

整形有short、int、long、longlong类型。

整数的二进制的表示方式有三种:源码,反码,补码。

三种表示方式均由符号位数值位组成,符号位中1表示负,0表示正,有符号整形中最高位为符号位,其余为数值位,无符号整形均表示数值位。

正数的源码、反码、补码相同

eg: int 10

源码:00000000  00000000  00000000  00001010

反码:00000000  00000000  00000000  00001010

补码:00000000  00000000  00000000  00001010

负数的源码、反码、补码不同,但有联系。

源码:将负数转化为二进制表示,最高位符号位为1。

反码:源码符号位不变,数值位按位取反。

补码:由源码符号位不变数值位取反加1,或者由反码直接加1。

eg: int -7

源码:10000000  00000000  00000000  00000111

反码:11111111    11111111    11111111    11111000

补码:11111111    11111111    11111111    11111001

对于整数来说,在内存中存储的是补码。


2、大小端存储

不难看出0x12345678这个数字按着倒序储存,这是什么原因呢?

2.1、什么是大小端存储

当存储的数超过一个字节时,就会有存储顺序,按照不同的存储顺序,将其分为大端字节序存储和小端字节序存储。

⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存 在内存的低地址处。

⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存 在内存的⾼地址处。

以下为我个人分辨大小端存储的方式:

大端存储:将数据高位字节的内容存储在内存低地址处。

小段存储:将数据低位字节的内容存储在内存低地址处。


3、浮点数在内存的存储

 3.1、引例

常⻅的浮点数:3.141592、1E10等,浮点数家族包括: float、double、long double 类型。

这个代码的输出结果为:

那么为什么第二行结果为0.000000,第三行结果为1091567616呢?

3.2、浮点数的存储:

要想理解这个结果,首先应该知道浮点数如何在计算机内部存储。

根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:

V = \left ( -1 \right )^{S}*M*2^{E}

S 表⽰符号位,当S=0,V为正数;当S=1,V为负数

M 表⽰有效数字,M是⼤于等于1,⼩于2的

2^{E}表⽰指数位

eg:

eg1:十进制的7.0为111.0,相当于1.11\times 2^{2}

按照上面的格式S = 0,M = 1.11,E = 2,

eg2:十进制的5.5为101.1,相当于1.011\times 2^{2}

按照上面的格式S = 0,M = 1.011,E  = 2,

eg3:十进制的0.5为0.1,相当于1\times2 ^{-1}

按照上面的格式S = 0,M = 1,E  = -1。

IEEE 754规定:

对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

3.2.1浮点数存储过程

EEE 754 对有效数字M和指数E,还有⼀些特别规定。

M应该大于等于1并且小于2,M可以写为1.xxxxxx的形式,其中xxxxxx表示小数部分。

IEEE 754规定,在计算机内部保存M时,默认这个数第一位总是1,因此可以舍去,只保存后面xxxxxx部分。比如保存1.1011时,只保存1011,等到读取时,自动吧第一位1加上去。这样做相当于节省1位有效数字。以64位浮点数为例留给M只有52位,将第一位1舍去后,等价于保存53位有效数字。

对于指数E

首先,E为一个无符号整形

这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047.但是

由3.2的eg3可以知道E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。eg:2^{3}的E是3,所以保存成32位浮点数时,必须保存为3+127 = 130,即10000011。

3.2.2 浮点数取的过程 指数E从内存中取出还可以再分成三种情况:

E不全为0或不全为1

eg :0.5相当于1.0\times 2^{-1}S = 0,M = 1.0,E  = -1。-1+127(中间数) = 126。尾数1.0去掉整数1应当补23个0。

其二进制表示方式为:

0   01111110  0000000000000000000000

E全为0

这时浮点数指数部分E为-127,若将整数部分后移一位指数部分变为1-127,M将变为0.xxxxxx的小数,此时趋近于0。

0 00000000 00100000000000000000000

E全为1

这时浮点数指数部分E为128,趋近于无穷大。

0 11111111 00010000000000000000000

关于浮点数的表示规则介绍到这里。


3.2.3、引例题解

现在已经了解了浮点数计算机存储的方式,解决一下开头的例子。

首先整形num=9

所以num的二进制表示为:00000000  00000000  00000000  00001001

以float类型浮点数的方式读取:0 00000000 000000000000000000001001

读取出来指数部分全是0,为3.2.2E全为0类型,则应该为无穷小0。

将其指针解引用赋值为9.0,即1.001\times 2^{3},E = 3,M为1.001,E部分加上127为130,M部分省略整数部分011。

其二进制表示方式为:0  10000010 00100000000000000000000

整形读取为:01000001  00010000  00000000  00000000

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值