代码之家  ›  专栏  ›  技术社区  ›  Andy

将整数赋给C位域[重复]

  •  1
  • Andy  · 技术社区  · 6 年前

    如果一个整数被分配给一个带位域的结构,结果是否定义得很好?

    #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)。

    1 回复  |  直到 6 年前
        1
  •  3
  •   gnasher729    6 年前

    当您将数据存储到无符号位字段(只存储给定数量的位)时,就会定义该行为。如果有符号int适合位字段,则定义行为,否则定义行为。

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