浮点类型在内存中的存储

文摘   2024-07-27 14:56   湖北  

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




前言

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现代化编程长啥样?


江湖评谈
记录,分享,自由。
 最新文章