我有以下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 -6 5
,对吗?
如果我错了请解释。
答案 0 :(得分:5)
-6
超出了3位signed int的范围。因此,您正在观察未定义实现定义行为的工件(实际上,您的值中最重要的部分将被丢弃)。
答案 1 :(得分:4)
{2, | -6, | 5 }
010 last 3 bits | 010 last 3 bits | 01 last 2 bits
2 2 1
答案 2 :(得分:1)
没有。输出为2 2 1
。
C编译器将值转换为Binary,并存储在内存中。
二进制值2:00000010
二进制值-6:11111010
(11111001 + 1)
二进制值5:00000101
存储在内存中:
对于2,将存储010。
对于-6,将存储010。
对于5,将存储01。
当您从main方法访问这些变量时,对于v.a将返回“010”,此处最左边的位用于符号。
所以v.a是2.类似地,v.b是2,v.c是1。
希望它有所帮助。