假设我有这样的代码:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char *argv[]) {
typedef struct{
uint16_t x : 9;
uint8_t y : 7;
} z;
printf("sizeof(z) = %lu\n",sizeof(z));
}
我对Mac上的clang有不同的结果(2)有人在Windows上告诉我它返回(3)。不确定我是否理解它,但我看到,当第一个编译器将结构压缩为9 + 7 = 16位时,另一个使用16位uint16_t和8位uint8_t。你能建议吗?
答案 0 :(得分:3)
不确定我是否理解它,但我看到,当第一个编译器将结构压缩为9 + 7 = 16位时,另一个使用16位uint16_t和8位uint8_t。你能告诉我吗?
关于比特字段要记住的第一件事是来自K&amp; R的这句话,第二部分:
(6.9比特字段)“关于字段的几乎所有内容都依赖于实现。”
它包括填充,对齐和位字节序。
答案 1 :(得分:0)
可能会出现两个问题:
位域是ANSI C规范中标准化程度很低的部分。编译器选择如何在位字段容器中分配位。您应该避免在结构中使用它们,而是可以使用#define或enum。
第二个可能的问题是编译器会通过添加填充来将结构放在内存中,以确保下一个对象与该对象的大小对齐。根据结构的大小放置结构的元素是一种很好的做法。 :
typedef struct{
uint8_t x : 7;
uint16_t y : 9;
} z;