微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 long double 在一个字符串中只占用 10 个字节?

如何解决为什么 long double 在一个字符串中只占用 10 个字节?

我有一个问题:long double 的大小是 16 bytes,当我用 sizeof() 检查没有问题时,它返回 16 但我这样做了使用 long double 强制转换用零填充 16 字节字符串的小程序,但它仅填充 10 字节的零而不是 16,仅比 longdouble 多两个,为什么会这样发生?

#include <stdio.h>

int main(void)
{
    char s[17] = "aaaaaaaaaaaaaaaa";

    *((long double *)s) = 0.L;
    for (int i = 0; i < 16; i++)
        printf("%d",(int)s[i]);
    write(1,"\n",1);
    return (0);
}

输出

0000000000979797979797

代替:

0000000000000000

对于 double,它输出良好:

000000009797979797979797

那么为什么它适用于 double 而不适用于 long double

解决方法

那是因为大多数实现只使用 80-bit (10 bytes) 来表示 long double (from Wikipedia):

在 x86 架构上,大多数 C 编译器都实现了 long double 作为 x86 硬件支持的 80 位扩展精度类型(通常存储为 12 或 16 字节以保持数据结构对齐),如 C99 / C11 标准(IEC 60559 浮点运算(附录 F))。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。