C 如何使数据类型小于32位

C 如何使数据类型小于32位,c,memory,byte,sizeof,bit,C,Memory,Byte,Sizeof,Bit,我已经创建了一个小字段 typedef struct { unsigned bit : 1; }BIT; sizeof运算符返回4…因此,struct实际上不是一个位,而是32。有没有办法强制c结构低于上述值?这一切都依赖于系统吗?(在我的书中,一个字符只有1个字节,而在我看来,sizeof(char)返回4…)您可以尝试对结构使用无符号字符或短字符,但也存在对齐问题。您可以尝试对结构使用无符号字符或短字符,但也存在对齐问题。如果只需要1位,为什么要使用结构?最小的存储单元是一个字节

我已经创建了一个小字段

typedef struct 
{
    unsigned bit : 1;
}BIT;

sizeof运算符返回4…因此,struct实际上不是一个位,而是32。有没有办法强制c结构低于上述值?这一切都依赖于系统吗?(在我的书中,一个字符只有1个字节,而在我看来,sizeof(char)返回4…)

您可以尝试对结构使用
无符号字符
短字符
,但也存在对齐问题。

您可以尝试对结构使用
无符号字符
短字符
,但也存在对齐问题。

如果只需要1位,为什么要使用结构?最小的存储单元是一个字节(通常为1个字符);为什么不将typedef位设置为char?

如果只需要1位,为什么要有一个struct?最小的存储单元是一个字节(通常为1个字符);为什么不将typedef位设置为字符?

标准保证
sizeof(char)
返回
1

对于
结构:不可能定义需要少于1字节内存的数据类型

对于位字段(
说明符),如果您真的必须以所有可能的方式节省一些内存,您可能很幸运可以执行以下操作:

typedef struct 
{
    char c1 : 4;
    char c2 : 4;
} MyPackedByte;
这将允许您在一个字节内存储两个4位值,但其行为可能是特定于编译器的,您可能需要使用一些预处理器指令,例如
#pragma pack


请参阅:

标准保证
sizeof(char)
返回
1

对于
结构:不可能定义需要少于1字节内存的数据类型

对于位字段(
说明符),如果您真的必须以所有可能的方式节省一些内存,您可能很幸运可以执行以下操作:

typedef struct 
{
    char c1 : 4;
    char c2 : 4;
} MyPackedByte;
这将允许您在一个字节内存储两个4位值,但其行为可能是特定于编译器的,您可能需要使用一些预处理器指令,例如
#pragma pack

请参阅:

6.7.2.1结构和联合规范

11一个实现可以分配任何足够大的可寻址存储单元来容纳一个位字段。 如果剩余的空间足够大,则表示一个位字段,该位字段紧跟在另一个位字段之后 结构应封装在同一单元的相邻位中。如果空间不足, 是否将不适合的位字段放入下一个单元或与相邻单元重叠是不确定的 实现定义。单元内位字段的分配顺序(从高阶到低阶) 低阶或低阶到高阶)是实现定义的。路线 未指定可寻址存储单元。 您的实现显然是分配一个32位的
无符号int
来包含位字段。检查编译器文档,看看是否有办法强制它对位字段使用较小的类型,尽管我不会屏住呼吸。

:

6.7.2.1结构和联合规范

11一个实现可以分配任何足够大的可寻址存储单元来容纳一个位字段。 如果剩余的空间足够大,则表示一个位字段,该位字段紧跟在另一个位字段之后 结构应封装在同一单元的相邻位中。如果空间不足, 是否将不适合的位字段放入下一个单元或与相邻单元重叠是不确定的 实现定义。单元内位字段的分配顺序(从高阶到低阶) 低阶或低阶到高阶)是实现定义的。路线 未指定可寻址存储单元。
您的实现显然是分配一个32位的
无符号int
来包含位字段。检查您的编译器文档,看看是否有办法强制它对位字段使用较小的类型,尽管我不会屏住呼吸。

您不应该对位字段使用sizeof()函数。你是设置如何“剪切”int的人,如果你以后真的需要得到int的大小,也许你可以把它存储在某个地方? 差不多 类型定义结构 { ``无符号位:1,位2:3

``大小\ t大小\位1,大小\位2; }比特

void initBIT() {
size_bit1=1;
size_bit2=3;
}

您不应该对位字段使用sizeof()函数。你是设置如何“剪切”int的人,如果你以后真的需要得到int的大小,也许你可以把它存储在某个地方? 差不多 类型定义结构 { ``无符号位:1,位2:3

``大小\ t大小\位1,大小\位2; }比特

void initBIT() {
size_bit1=1;
size_bit2=3;
}

我怀疑您的'sizeof(char)'返回4。可能您的
sizeof('a')
返回了4左右。C中的字符常量不是
char
类型,而是
int
@haccks,no,no,no。
sizeof
定义为返回对象中
char
的数量,因此
sizeof(char)
始终为1。如果您的编译器告诉您不同的内容,那么它肯定不是C编译器。@haccks:type
char
根据定义大小为1;宏
CHAR\u BITS
告诉您单个
CHAR
中有多少位(至少8位,但可能更多)。
char
值是否映射到目标平台上的单个字节取决于实现。例如,一个旧的体系结构(PDP?)使用36位字,它可以保存5个7位字符值,剩余一位。将
char
值映射到该体系结构将是一项挑战。@C中的haccks“byte”不一定是8位,而是“可寻址的数据存储单元,其大小足以容纳执行环境基本字符集的任何成员”。它也必须大于等于8位。IWO,一个
char
。因此
char
的大小始终为1。在这个C语言之外