3

我有以下 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,对吧?

如果我错了,请解释。

4

3 回答 3

5

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

于 2013-09-01T15:34:37.883 回答
4
{2,             |  -6,             |        5        }
010 last 3 bits |  010 last 3 bits |  01 last 2 bits
2                  2                        1    
于 2013-09-01T15:39:34.480 回答
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。

希望能帮助到你。

于 2013-09-01T15:34:33.540 回答