C 结构-解释输出:

C 结构-解释输出:,c,struct,bit-fields,C,Struct,Bit Fields,我有下面的C代码 struct values{ int a:3; int b:3; int c:2; }; void main(){ struct values v={2,-6,5}; printf("%d %d %d",v.a,v.b,v.c); } 当我执行代码时,我得到以下输出: 2 2 1. 但是输出应该是2-65,对吗 如果我错了,请解释。否。输出为21 C编译器将值转换为二进制,并存储在内存中 二进制值2:00000010 -6的二进制值:11111010

我有下面的C代码

struct values{
  int a:3;
  int b:3;
  int c:2;
};

void main(){
  struct values v={2,-6,5};
  printf("%d %d %d",v.a,v.b,v.c); 
}
当我执行代码时,我得到以下输出:

2 2 1.
但是输出应该是
2-65
,对吗


如果我错了,请解释。

否。输出为
21

C编译器将值转换为二进制,并存储在内存中

二进制值2:
00000010

-6的二进制值:
11111010
(11111001+1)

二进制值5:
00000101

在内存中存储时:

对于2010年,将存储

对于-6,将存储010

对于5,将存储01

当您从主方法访问这些变量时,将返回v.a“010”,这里最左边的位是符号

所以v.a是2。同样,v.b为2,v.c为1


希望有帮助。

-6
超出了3位有符号整数的范围。因此,您正在观察未定义的实现定义行为的工件(实际上,您的值的最重要位被丢弃)。

您熟悉位字段吗?(:3等)OS X上的Clang编译器给了我一个很好的警告:“从'int'到位字段的隐式截断将值从-6更改为2[-Wconstant conversion]”。是的,但实现定义的行为(c99,6.3.1.3p3)不是没有理由的考虑者对这个答案做了一点详细说明。@P0W只是在浏览答案,没有心情投票,但看了你的解释后无法抗拒。。。。。简短但解释一切,除非一个人理解某事+1:)其他人也是:P
{2,             |  -6,             |        5        }
010 last 3 bits |  010 last 3 bits |  01 last 2 bits
2                  2                        1