C数据类型,用于存储double或long或任何其他数据

时间:2017-01-29 18:00:35

标签: c types

我想创建一个可以容纳3个单词'data'的c结构。

struct _Obj {
    ??? a;
    ??? b;
    ??? c;
}
typedef struct _Obj Obj;

但是,我希望能够在a,b和c中存储不同类型的数据,并在需要时适当地投射它们。

例如,有时'a'可能很长,有时候它会是双倍的,而有些则是指针。运行时我会知道它们中存储了什么,所以我希望能够在需要时编译时间(立即)将它们转换为数据类型。

Obj obj;
long a = 893;
obj.a = a;
double b = 3.14159;
obj.b = b;

long newA = (long)obj.a;
double newB = (double)obj.b;

基本上,我只是希望能够存储一些比特,然后以特定的方式解释它们。我该怎么做?

2 个答案:

答案 0 :(得分:1)

使用联盟:

union {
    long integer;
    double floating_point;
    void *pointer;
} obj;

你不需要在这里进行铸造,它比铸造更安全。此外,施放不一定是运行时无操作(在小端,可能,但在其他方面没有),所以如果你想要零投射开销,联盟真的是你最好的选择。

如果您想要在编译时确定类型,那么自C11以来还有_Generic feature

答案 1 :(得分:0)

C允许进行位重新解释。

只需为您的数据定义二进制格式,然后解压缩。您可以移植提取浮点类型,但这可能是过度杀伤。也许我们可以说我们需要的最长数据是80位双。所以30个字节应该足够了,加上两个字节来说明数据的类型。所以32个字节是一个很好的两个数的圆幂。