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

C 最小数据类型-我可以定义一位变量吗?,c,types,C,Types,我只需要一位来表示我的数据-1或0。在C中这样做的最佳方式是什么?“普通”数据类型太大。如果确实需要,可以创建一个成员变量为1位的结构 请记住,成员变量的数据类型需要是无符号的,因为您需要存储可以创建的0和1 typedef struct foo { unsigned x:1; } foo; 您告诉编译器您将只使用一位x 但由于结构打包安排(C标准有意灵活,以便编译器可以根据机器架构进行优化),结果很可能是,它在内存中所占的空间仍然与常规的无符号一样多,而且foos数组不必是按位连续的

我只需要一位来表示我的数据-1或0。在C中这样做的最佳方式是什么?“普通”数据类型太大。

如果确实需要,可以创建一个成员变量为1位的结构

请记住,成员变量的数据类型需要是无符号的,因为您需要存储可以创建的
0
1

typedef struct foo
{
    unsigned x:1;
} foo;
您告诉编译器您将只使用一位
x


但由于结构打包安排(C标准有意灵活,以便编译器可以根据机器架构进行优化),结果很可能是,它在内存中所占的空间仍然与常规的
无符号
一样多,而且
foo
s数组不必是按位连续的。

通常,C中最小的可寻址数据块是一个字节。不能有指向位的指针,因此不能声明1位大小的变量。但正如苏拉夫·戈什(Sourav Ghosh)已经指出的那样,您可以声明位字段,其中一位可以直接访问。

可移植的方法是定义一个变量,将各个位用作标志

    #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);
    }
#定义标志_foo0
#定义标志栏1
//如果平台不支持uint8\u t
typedef无符号字符uint8;
uint8_t旗;
无效标志_foo_set()
{

flags |=(1如果您不需要这些标志中的数百万个,或者内存限制非常有限,那么最好的方法就是使用
int

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


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

非常迂腐,是不是每个ANSI C编译器都必须支持
uint8\u t
?我不完全确定。
无符号字符
可能是一个更好的选择。不,uintX\u t类型只有C99需要——为了完全的可移植性,请使用
un有符号字符
typedef unsigned char uint8;
对我来说似乎有潜在的危险。为什么,芭丝谢芭?请详细说明。内存太少了,你需要将值存储为单个位吗?你用它做什么?也许有更好的方法。使用
#pragma pack(1)
#pragma pack(0)
在结构周围避免您解释的打包排列方式?掩蔽和移位需要0.5-1个周期。添加int可以使您跨越对齐边界并显著增加内存占用。