This question already has an answer here:
Closed last year.
Assigning a value to bitfield with length 1
(1个答案)
如果为具有位字段的结构指定了整数,则结果是否定义良好?
#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

所以在我的测试中,只有位0被分配给实际的位字段(分配4将导致0)。
avr-gcc(最终目标是Atmel-avr)甚至不发出警告,但是否定义了这种行为?

最佳答案

该行为是在存储到无符号位字段时定义的(仅存储给定数量的位)。如果有符号int符合位字段,则定义该行为,否则该行为是实现定义的。
显然,如果声明宽度为1的位字段,则不能期望存储多个位。

关于c - 将整数分配给C位字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52041247/

10-10 20:00