C#之double内存

int的内存如何表示,基本上很清楚了,但是double的内存如何布局的?有点懵,最近在做flv格式的时候,刚好要用到,所以,就研究一下。这里是网络字节序表示。

写个小demo

            Double duration = 1;
            var bd = BitConverter.GetBytes(duration);

 

 总结:

double暂用8个字节的内存空间。

内存空间其实现在一点都看不懂。如何计算出来的呢?

这个好难啊,我准备先举几个例子,再一起总结规律

数值内存的值
10x3f 0xf0 0x00 0x00 x00 0x00 0x00 0x00
-10xbf 0xf0 0x00 0x00 x00 0x00 0x00 0x00
0.50x3f 0xe0 0x00 0x00 x00 0x00 0x00 0x00
-0.50xbf 0xe0 0x00 0x00 x00 0x00 0x00 0x00
1.50x3f 0xf8 0x00 0x00 x00 0x00 0x00 0x00

网上找了一段定义

 

 第一位为符号为,我们算一下:

1 --》0x3f --->0011 1111 第一位为0

-1--》0xBf--->1011 1111 第一位为1

所以0 表示正数 1表示负数

指数位到底是什么呢?

定义如下:

IEEE 754 国际标准 规定,double 型 64位。1位“数的符号”,11位“指数位”,52位“有效数位”。
排列:“数的符号”“指数位”“有效数位”
指数位 用 偏正值 表示,即:偏正值 = 实际的指数大小+1023。

1的指数为为011 1111 1111 ---》1023---》实际值0

-1的指数为为111 1111 1111 ---》1023---》实际值0

0.5的指数为为011 1111 1111 ---》1022---》实际值-1

-0.5的指数为为111 1111 1111 ---》1022---》实际值-1

我们改写一下

1 = 1*2^0

-1= -1*2^0

0.5=1*2^-1

-0.5=-1*2^-1

^后面的值就是实际值,这样就对应起来了。

尾数部分,表示什么呢?

我们再看1.5那个例子

1.5 -》0011 1111 1111 1000 ---》符号位0  指数位实际值0 尾数:100000……0

尾数指的是小数部分的2进制表示

我们把1.5表示成2进制  1.1*2^0 --->所以符号位为0 指数位为0  小数位为1 占据52位的第一位

下面来个复杂一点的

189.5 转换成2进制表示方式:1011 1101 .1  ---》1.011 1101 1*2^7

---->内存排序:0100  0000 0110 0111 1011 0000---》0x40 0x67 0xB0

看图:

 结果是一致的。

总结:

double的内存排序,主要是要考虑符号位+指数位+尾数位,其实就是转成二进制的形式,在表示成科学计数的形式,然后按照定义进行排序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值