gpt4 book ai didi

c - 位域及其对齐方式在 C 编程中如何工作?

转载 作者:太空宇宙 更新时间:2023-11-04 05:39:15 25 4
gpt4 key购买 nike

我需要你的帮助来理解位域在 C 编程中的工作原理。

我已经声明了这个结构:

struct message
{
unsigned char first_char : 6;
unsigned char second_char : 6;
unsigned char third_char : 6;
unsigned char fourth_char : 6;
unsigned char fifth_char : 6;
unsigned char sixth_char : 6;
unsigned char seventh_char : 6;
unsigned char eigth_char : 6;
}__packed message;

我使用 sizeof(message) 将结构的大小保存为一个整数。

我认为大小的值将是 6,因为 6 * 8 = 48 位,即 6 个字节,但它的大小值为 8 个字节。

任何人都可以向我解释为什么以及位域及其对齐方式的工作原理吗?

编辑

我忘了解释我使用结构的情况。假设我以这种形式收到 6 个字节的数据包:void * 数据包

然后我像这样转换数据:

message * msg = (message *)packet;

现在我想打印每个成员的值,所以虽然我将成员声明为 6 位,但成员使用 8 位导致打印时结果错误。例如我收到下一个数据:

00001111 11110000 00110011 00001111 00111100 00011100

我认为成员的值(value)将如下所示:

first_char = 000011

秒 = 111111

第三 = 000000

第四个 = 110011

第五 = 000011

第六 = 110011

第七 = 110000

eigth = 011100

但这不是hapening,我希望我解释得很好,如果没有请告诉我。

最佳答案

位域不必跨越不同的底层元素(“单位”),因此您会看到每个域都占据了一个完整的无符号字符。不过,行为是实现定义的;比照。 C11 6.7.2.1/11:

An implementation may allocate any addressable storage unit large enough to hold a bit-field. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecified.

此外,根据 6.7.2.1/4 中的约束,任何位域都不能大于适合一个单元的内容:

The expression that specifies the width of a bit-field shall be an integer constant expression with a nonnegative value that does not exceed the width of an object of the type that would be specified were the colon and expression omitted.

关于c - 位域及其对齐方式在 C 编程中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23458733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com