| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1475 人关注过本帖
标题:long double在内存中的存储方式
取消只看楼主 加入收藏
hwl88618
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2021-9-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
long double在内存中的存储方式
最近在学习浮点数相关的知识,float和double已经能完全理解了,但是long double这个类型,感觉存储的方式很奇怪啊
以最简单的浮点数为例,3.0
按浮点数的存储方式,3.0应该变成1.5 * 2 ^ 1,也就是二进制1.1 * 2 ^ 1,在内存中的存储,符号位是0,指数位最高位为1,后面为0,底数位去掉小数点前的1,最高位1,后面为0
实测,float在内存中是0x40400000,double在内存中是0x40800000 00000000,两者都符合上面的分析
但到了long double,情况完全不一样了。网上查到,float为32位,double为64位,long double为96位,也就是float占4字节,double8字节,long double应该12字节,实测前两者没问题
long double在不同的架构下结果完全不同
在32位x86 centos 7,gcc 4.8.5中,long double长度为12字节,也就是96位,没问题,但到了arm中,同样是centos 7,同样是32位,同样是gcc4.8.5,long double却只有8字节,存储方式跟double完全一样。mips debian 32位中,gcc 8.3,long double跟double也完全一样
到了64位系统中,我分别测试了linux mint 20 gcc 4.8.4,linux mint 20 gcc 9.3和centos 8 gcc 8.3,这三个结果相同,长度都为16字节。
以上是内存占用。然后再说一下具体的存储方式
几个32位系统,除了centos 7 gcc 4.8.5,其他几个都跟double完全一样,就不再讨论了
centos 7 gcc 4.8.5虽然比64位系统中long double小了4字节,但是低位的12字节存储方式是完全一样的,64位系统中高4字节全为0,所以这几个可以一起讨论
按前面说的存储方式,long double的值3.0,理论上应该是最高位符号位为0,指数最高位为1,后面为0,底数位最高位1,后面为0,也就是在内存中应该存储为0x40008000 00000000 00000000
但是,实测发现内存中存储的是这个值:0x00004000 c0000000 00000000
又测试发现-3在内存中是0x0000c000 c0000000 00000000
也就是说,符号位不是96位中的最高位,高16位始终为0,实际占用的只有80位
然后,底数不是刚才分析的最高位1,后面为0,而是最高2位为1,后面为0,底数没有删掉小数点左边的1

贴上我测试用的代码:

程序代码:
#include <stdio.h>
#include <string.h>

int main()
{
    union
    {
        int i[1];
        long double d;
    }u;
    memset(&u, 0, sizeof(u));
    printf("size of void*: %d\n", (int)sizeof(void*));
    printf("size of long double: %d\n", (int)sizeof(long double));
    u.d = 3;
    printf("%llg\n", u.d);
    int i;
    printf("0x");
    for (i = sizeof(u) / sizeof(int) - 1; i >= 0; i--)
    {
        printf("%08X ", u.i[i]);
    }
    printf("\n");
}
搜索更多相关主题的帖子: 内存 字节 long 存储 double 
2021-09-27 15:10
hwl88618
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2021-9-26
收藏
得分:0 
另外,怎么在帖子里发图片啊,没找到啊
2021-09-27 15:12
hwl88618
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2021-9-26
收藏
得分:0 
回复 3楼 rjsp
也就是说80位够用,有钱任性呗
话说,我查了一下,80387是好老的东西了,至少20多年的历史了,现在还在用这个吗?为什么这么多年了,没有往更多的位数上发展,反而像你说的,long double降成了跟double一样?
硬件这方面,应该怎么学呢,有哪些资料可以参考呢?
2021-09-27 16:37
hwl88618
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2021-9-26
收藏
得分:0 
回复 11楼 自由而无用
thx
hwl is the 1st letters of my name, and digits for my birthday.
and I'm curious about why you are always using English? I don't think you are from other countries.
2021-09-28 09:27
快速回复:long double在内存中的存储方式
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012152 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved