浮点类型在内存中的存储

点击上方蓝字 江湖评谈设为关注/星标

04a4073ad904a495328b7a10c3eab989.png

前言

float类型在内存中的存储跟int是不一样的,本篇看下。

浮点操作

例子:435数值

十进制的435的int类型(十六进制:0x1B3)内存存储:

0000 0001 1011 0011

32位浮点型的内存存储遵循:SEM原则,S(1位)即符号位,0为整数,1表示负数。E(8位)表示指数,为了区分指数的正负数(实际上指数没有正负数)所以指数需要另外+127。M(23位)则是有效数值。

十进制的435浮点型内存存储:

第一步:435的二进制 0001 1011 0011
第二步:二进制左移小数点到最左边的1后面,这里即是移动8位。结果是 0001.10110011*2的8次方
第三步:套用上面的SEM原则,435为正数,所以第一位为0,E指数为8+127==135,二进制的1000 0111,M则是第二步结果小数点后面的数值10110011,忽略掉小数点前面的1
第四步:把M补齐23位SEM结果是, 0 1000 0111 10110011000000000000000(01000011110110011000000000000000)
最终内存结果:0x43D98000

也就是说32位的浮点型435在内存中的结果是:0x43D98000。‍

如果是小数点后面带数字的呢?这里需要把小数点后面的数字乘2,取整数,当小数部分为0则结束。

如:10.5

0.5*2 ==1.0   小数部分为0不再继续乘2了,取整数部分1当有效数值  
10的二进制:1010  5的二进制1,则合成:1010.1
取指数:1.0101*2的三次方
SEM整体:   S:0  E:1000 0010 M:01010000000000000000000
结果:01000001001010000000000000000000(0x41280000)

这里也涉及到*2一直不为零的状况,比如圆周率3.14,所以涉及到精度问题。duble比float更精确的意思是dobule存储的有效位数更多,更能精确表达。

0.14*2==0.28  0.28*2==0.56    0.56*2==1.12    0.12*2=0.24 
0.24*2==0.48  0.48*2==0.96

注意 0.56*2==1.12,这里依然取1.12的小数部分0.12继续乘2来计算。结果依旧遵循SEM原则。

往期精彩回顾

.NET9现代化编程长啥样?

e01c0c112af6d1baceaaab0db1030eaa.jpeg

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值