如果将整数分配给具有位域的结构,结果是否定义正确?
#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警告
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
因此,在我的测试中,仅将bit0分配给了实际的位域(分配4会得出0)。
avr-gcc(最终目标是Atmel AVR)甚至没有发出警告,但是是否定义了此行为?
答案 0 :(得分:3)
当您将其存储到无符号位字段(仅存储给定数量的位)时,将定义行为。如果将有符号的int放入bit字段中,则定义该行为,否则该行为由实现定义。
很明显,如果声明一个宽度为1的位字段,则不能期望存储多个位。