最小的数据类型 - 我可以定义一位变量吗?

时间:2015-07-09 07:12:53

标签: c types

我只需要一位来表示我的数据 - 1或0.在C中这样做的最佳方法是什么? "正常"数据类型太大。

5 个答案:

答案 0 :(得分:15)

你可以创建

typedef struct foo
{
    unsigned x:1;
} foo;

您告诉编译器您只使用x的一位。

但是由于结构打包安排(C标准是有意灵活的,以便编译器可以根据机器架构进行优化),很可能会发现这仍然占用了内存中与常规{{1}一样多的空间。并且unsigned的数组不必按位连续。

答案 1 :(得分:5)

如果您真的想要,可以使用成员变量bit-fielded创建一个结构到1位。

请记住,成员变量的数据类型必须为unsigned,因为您需要存储01

答案 2 :(得分:5)

如果您不需要数百万这些标记或内存限制非常有限,最好的方法绝对是int

这是因为int通常与您平台的自然字大小相对应,并且可以快速访问正确对齐的内容。无论如何,机器一次读取一个字,并且使用单个位需要屏蔽和移位,这需要花费时间。在具有千兆字节RAM的典型PC上,这将是愚蠢的。

如果内存消耗确实是一个问题,则存在位域结构。

答案 3 :(得分:3)

可移植方式是变量的定义,其中各个位用作标志。

    #define FLAG_FOO 0
    #define FLAG_BAR 1

    // in case platform does not support uint8_t
    typedef unsigned char uint8_t;

    uint8_t flags;

    void flag_foo_set()
    {
        flags |= (1 << FLAG_FOO);
    }

    void flag_foo_clr()
    {
        flags &= ~(1 << FLAG_FOO);
    }

    uint8_t flag_foo_get()
    {
        return flags & (1 << FLAG_FOO);
    }

虽然与C位字段相比,这似乎是超级流行的。它几乎可以移植到每个ANSI C编译器。

答案 4 :(得分:0)

通常,C中最小的可寻址数据块是一个字节。您不能指向某个位,因此您无法声明1位大小的变量。但正如Sourav Ghosh已经指出的那样,你可以声明位域,直接访问一位。