C语言 用int封装长双精度浮点数

rryofs0p  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(129)

在gcc/clang上,long double使用10个字节,但占用16个字节。如果这个结构体是16个字节,那就好了,但实际上是32个字节,浪费了一半的带宽。

struct {
    long double x;
    int id;
};

字符串
我尝试union两个值,但since compiler assumes the whole 16 bytes used only by the long double , editing it sometimes modifies int .
有什么好的办法把它们 Package 得很好吗?

ymdaylpp

ymdaylpp1#

在gcc/clang上,long double使用10个字节,但占用16个字节。
我想你的意思是long double的存储大小是16个字节,其中只有10个对它的数值有意义(所以6个是填充的)。
这主要是编译器正在构建的目标ABI的属性,而不是编译器本身的属性。
如果这个结构体是16个字节,那就好了,但实际上是32个字节,浪费了一半的带宽。
您是否考虑过使用double而不是long double
在任何情况下,union都是C提供两个或多个活动对象具有重叠存储的唯一方式,其中任何对象都不包含另一个对象。这并不能达到同时存储两个重叠值的目的。假设您知道long double的前10个字节是有效字节,并且int的大小为4。你可以想象这样做:

union problemmatic {
    long double x;
    struct {
        char padding[12];
        int id;
    }
};

字符串
但是,

  • 假设对成员x的写入只写入10个有效字节而不写入其他字节是不安全的,并且
  • 假设先写入x然后再写入id不会导致x的存储值成为陷阱表示是不安全的

也就是说,写入任何一个成员都可能使另一个成员无效。
底线是:如果您想使用更少的存储空间,请使用更小的数据类型(即double而不是long double)。如果您使用的是现在正在使用的数据类型,那么它们的存储占用空间是包的一部分。

a5g8bdjr

a5g8bdjr2#

union {
    long double x;
    struct {
        int reserved[3];
        int id;
    };
};

字符串

相关问题