如果一个整数被分配给一个带位域的结构,结果是否定义得很好?
#include <stdio.h> #include <stdint.h> struct my_struct { uint8_t a_byte; float a_float; uint8_t baz:1; uint8_t boo:1; } __attribute__((__packed__)); int main () { struct my_struct foo; foo.a_byte = 5; foo.a_float = 3.14159; foo.boo = 0; foo.baz = 3; /* this one */ printf ("a_byte = %i\n", foo.a_byte); printf ("a_float = %f\n", foo.a_float); printf ("baz = %i\n", foo.baz); printf ("boo = %i\n", foo.boo); return 0; }
用编译 gcc -Wall -Wextra main.c ,gcc警告
gcc -Wall -Wextra main.c
main.c:19:13: warning: large integer implicitly truncated to unsigned type [-Woverflow] foo.baz = 3;
a_byte = 5 a_float = 3.141590 baz = 1 boo = 0
所以在我的测试中,只有位0被分配给实际的位域(分配4将导致0)。
当您将数据存储到无符号位字段(只存储给定数量的位)时,就会定义该行为。如果有符号int适合位字段,则定义行为,否则定义行为。
显然,如果声明一个宽度为1的位字段,则不能期望存储多个位。