我有以下 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
,对吧?
如果我错了,请解释。
我有以下 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
,对吧?
如果我错了,请解释。
-6
超出 3 位有符号整数的范围。因此,您正在观察未定义的实现定义行为的工件(实际上,您的价值中最重要的位被丢弃了)。
{2, | -6, | 5 }
010 last 3 bits | 010 last 3 bits | 01 last 2 bits
2 2 1
不,输出是2 2 1
。
C 编译器将值转换为二进制,并存储在内存中。
二进制值 2 :00000010
-6 的二进制值:11111010
(11111001+1)
二进制值 5 :00000101
在内存中存储时:
对于 2,将存储 010。
对于 -6,将存储 010。
对于 5,将存储 01。
当您从 main 方法访问这些变量时,将返回 for va "010",这里最左边的位是符号。
所以 va 是 2。类似地,vb 是 2,vc 是 1。
希望能帮助到你。