将整数分配给C位字段

时间:2018-08-27 14:12:03

标签: c bit-manipulation avr-gcc

如果将整数分配给具有位域的结构,结果是否定义正确?

#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)甚至没有发出警告,但是是否定义了此行为?

1 个答案:

答案 0 :(得分:3)

当您将其存储到无符号位字段(仅存储给定数量的位)时,将定义行为。如果将有符号的int放入bit字段中,则定义该行为,否则该行为由实现定义。

很明显,如果声明一个宽度为1的位字段,则不能期望存储多个位。