Tag: 位字段

c – 不能取位域的地址

为什么不能取位域的地址? 如何制作指向位字段的指针? 这是代码…… struct bitfield { unsigned int a: 1; unsigned int b: 1; unsigned int c: 1; unsigned int d: 1; }; int main(void) { struct bitfield pipe = { .a = 1, .b = 0, .c = 0, .d = 0 }; printf(“%d %d %d %d\n”, pipe.a, pipe.b, pipe.c, pipe.d); printf(“%p\n”, &pipe.a); /* […]

在C中是否有一个相当于sizeof()的东西?

应用于位域时,Sizeof()不起作用: # cat pc #include int main( int argc, char **argv ) { struct { unsigned int bitfield : 3; } s; fprintf( stdout, “size=%d\n”, sizeof(s.bitfield) ); } # gcc pc -op pc: In function ‘main’: pc:5: error: ‘sizeof’ applied to a bit-field …显然,因为它不能返回浮点部分大小或其他东西。 然而,它提出了一个有趣的问题。 在C中是否有一个等价物来告诉你变量/类型中的位数? 理想情况下,除了位域之外,它也适用于常规类型,如char和int 。 更新: 如果对于位域没有相当于sizeof()的语言,那么计算它的最有效方法是什么 – 在运行时! 想象一下,你有依赖于此的循环,如果改变位域的大小,你不希望它们破坏 – 并且没有公平的作弊,并使位域大小和循环长度成为宏。 […]

sizeof(struct)对于不同的编译器是不同的

假设我有这样的代码: #include #include 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。 你能告诉我吗?

struct bitfield max size(C99,C ++)

位结构字段的最大位宽是多少? struct i { long long i:127;} 我可以在struct中定义一个位域,位域大小可以达到128位,或者是256位,还是更大? 有一些超宽的矢量类型,如sse2(128位),avx1 / avx2(256位),avx-512(下一个Xeon Phis为512位)寄存器; 以及gcc中的__int128等扩展名。

零长度位域的实际应用

我不完全确定C,但C ++允许未命名的0字段位字段。 例如: struct X { int : 0; }; 问题一:你能想到什么实际用途? 问题二:你知道什么是现实世界的实际用途(如果有的话)? 在冰犯罪的回答之后编辑了这个例子 编辑:好的,多亏了目前的答案,我现在知道了理论目的。 但问题是关于实际用途,所以他们仍然持有:)