【问题标题】:Why does a long double take up only 10 bytes in a string? [duplicate]为什么 long double 在一个字符串中只占用 10 个字节? [复制]
【发布时间】:2021-04-11 13:05:02
【问题描述】:

我有一个问题:long double 的大小是16 bytes,当我检查sizeof() 没有问题时,它返回16 但我做了这个小程序来填充一个 16 字节的字符串使用long double 强制转换为零,但它只填充了 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

【问题讨论】:

标签: c types


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2018-09-07
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2022-07-06
    相关资源
    最近更新 更多