C 结构-解释输出:
我有下面的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
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