Tag: 位字段

无符号整数位域移位产生有符号整数

让我们考虑以下程序test.c : #include struct test { unsigned int a:5; }; int main () { unsigned int i; struct test t = {1}; for (i = 0; i < ta << 1; i++) printf("%u\n", i); return 0; } 使用gcc -Wsign-compare test.c编译时,会生成以下警告(使用gcc 4.8.1进行测试): test.c:9:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for (i = 0; […]

是否允许比特字段的聚合初始化?

我有一个包含位字段的结构: struct Foo { unsigned a : 16, b : 16; }; 我想知道我是否可以在它的位字段上使用聚合初始化。 例如: struct Foo bar = {13, 42}; 我注意到这在gcc 5.1和Visual Studio 2015中都有效。我只想certificate这是C和C ++的标准批准初始化。

具有位字段的结构中的偏移量

如果我们有一个带有位字段的结构,那么后续成员如何在结构中对齐? 请考虑以下代码: struct A{ int a:1; char b; // at offset 1 }; struct B{ int a:16; int b: 17; char c; // at offset 7 }; printf(“Size of A: %d\n”, (int)sizeof(struct A)); printf(“Offset of b in A: %d\n”, (int)offsetof(struct A, b)); printf(“Size of B: %d\n”, (int)sizeof(struct B)); printf(“Offset of c in B: %d\n”, (int)offsetof(struct […]

C代码后变量名后的冒号

可能重复: ‘unsigned temp:3’是什么意思 这是参考页面的C代码示例。 signed int _exponent:8; “8”和“8”之前结肠的含义是什么?

结构 – 解释输出:

我有以下C代码。 struct values{ int a:3; int b:3; int c:2; }; void main(){ struct values v={2,-6,5}; printf(“%d %d %d”,va,vb,vc); } 当我执行代码时,我得到以下输出: 2 2 1. 但输出应该是2 -6 5 ,对吗? 如果我错了请解释。

结构末尾的未命名位域的目的是什么

我正在学习C.在C Primer Plus中 ,我看到了一个字段示例如下: struct box_props { bool opaque : 1; unsigned int fill_color : 3; unsigned int : 4; bool show_border : 1; unsigned int border_color : 3; unsigned int border_style : 2; unsigned int : 2; }; 我知道中间的4位未命名位字段用于让后续位从一个新字节开始。 但是,我不明白为什么在结构的末尾有另一个未命名的位字段。 它的目的是什么? 有必要吗?

通过其地址访问C中的位字段

不允许使用其地址访问C中的位字段的原因是什么,是因为它可能不是一个非系统字对齐的地址..? 或者因为在一个字节内得到位的地址没有意义……?(因为这种类型的指针运算会很尴尬吗?)

c联合和位域

可以在联合中使用位域吗?

ANSI C是否支持有符号/无符号位字段?

将位字段限定为有符号/无符号是否有意义?

比特域的类型是什么?

我在C标准中找不到指定的任何地方。 例如,在 struct { signed int x:1; } foo; 是foo.x是int类型的左值还是其他什么? 因为你不能在其中存储int类型的任何值,只有0或-1,但是我找不到任何可以为它分配不同类型的语言,因此它似乎不自然地成为int类型的左值。 当然,在大多数表达式中使用它,无论如何它都会被提升为int ,但是实际的类型在C11中与_Generic有所不同,我在标准中找不到任何关于bitfields如何与_Generic交互的语言。