将整数分配给 C 位域

assign integer to C bitfield

如果将整数赋值给带位域的结构,结果是否定义明确?

#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)甚至没有警告,但这种行为是否已定义?

当您存储到无符号位字段时定义行为(仅存储给定的位数)。如果 signed int 适合位字段,则行为被定义,否则行为是实现定义的。

显然,如果您声明宽度为 1 的位域,则不能期望存储超过一位。