C 为什么结构成员似乎具有溢出值?

C 为什么结构成员似乎具有溢出值?,c,struct,structure,padding,bit,C,Struct,Structure,Padding,Bit,在下面的代码中,我得到一个=-1作为输出。我猜,这是因为我溢出了3位的A成员。 在这方面,我有两个问题: 对于成员A,编译器不应该考虑最后3位而忽略其余部分吗?为什么这个值是负值 如果考虑了所有位,为什么要将B=0的值作为输出 我原以为A的值是7,但我显然误解了什么。请帮忙 #include <stdio.h> typedef struct { char A: 3; char B: 3; char C: 3; }my_struct; my_struct new_obje

在下面的代码中,我得到一个=-1作为输出。我猜,这是因为我溢出了3位的A成员。 在这方面,我有两个问题:

  • 对于成员A,编译器不应该考虑最后3位而忽略其余部分吗?为什么这个值是负值
  • 如果考虑了所有位,为什么要将B=0的值作为输出
  • 我原以为A的值是7,但我显然误解了什么。请帮忙

    #include  <stdio.h>
    typedef struct
    {
      char A: 3;
      char B: 3;
      char C: 3;
    }my_struct;
    my_struct new_object = {0};
    
    void main(void)
    {
      new_object. A = 63;
      printf("A = %d\n", new_object.A);
      printf("B = %d\n", new_object.B);
    }
    
    #包括
    类型定义结构
    {
    字符A:3;
    字符B:3;
    字符C:3;
    }我的结构;
    my_struct new_object={0};
    真空总管(真空)
    {
    新对象A=63;
    printf(“A=%d\n”,新对象.A);
    printf(“B=%d\n”,新对象.B);
    }
    
    我以为A的值是7

    嗯。7是二进制的111。但是你有一个签名字符(显然,因为你告诉我们它是-1)。所以你需要做:

    typedef struct
    {
      unsigned char A: 3;
      unsigned char B: 3;
      unsigned char C: 3;
    }my_struct;
    

    将63分配给未定义的行为不是吗?所以结果可能是任何东西。@CostantinoGrana:不,不是。它不是作为
    charc=0xffff不是。感谢C的隐式转换。@alk:谢谢你提供的信息。我不知道整数转换中包含位字段。谢谢。将其设为unsigned会为a提供7的值。但是,我现在很困惑,为什么在未写入unsigned的情况下它会给我-1的值。我不应该得到-3的值,因为它是3位的。最高有效位可用于符号,其余两位应设置?这不应该发生吗?我正在使用链接中的编译器:
    111
    中的二元补码二进制是-4+2+1,实际上是-1。一切如期而至-3是101。哎呀!谢谢你,约翰。我完全忘了负数存储在2的补码中。愚蠢的我。对不起,没问题。世界上只有10种人:懂二进制的人和不懂二进制的人。