【问题标题】:Struct - Explain the output:结构 - 解释输出:
【发布时间】:2013-09-01 15:33:06
【问题描述】:

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

如果我错了,请解释。

【问题讨论】:

  • 你熟悉位域吗? (:3等)
  • OS X 上的 Clang 编译器给了我一个很好的警告:“从 'int' 到位域的隐式截断将值从 -6 更改为 2 [-Wconstant-conversion]” .

标签: c struct bit-fields


【解决方案1】:

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

【讨论】:

  • 是,但实现定义的行为(c99、6.3.1.3p3)未定义
【解决方案2】:
{2,             |  -6,             |        5        }
010 last 3 bits |  010 last 3 bits |  01 last 2 bits
2                  2                        1    

【讨论】:

  • 考虑详细说明这个答案。
  • @P0W 只是在看答案,没有心情投票,但在看了你的解释后无法抗拒......简短但解释了一切,除非有人理解.. +1 :) 和其他人:P
【解决方案3】:

没有。输出为2 2 1

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

二进制值2:00000010

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

二进制值 5:00000101

在内存中存储时:

对于 2,将存储 010。

对于 -6,将存储 010。

对于 5,将存储 01。

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

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2017-08-07
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2012-05-19
    • 2014-02-17
    • 2011-05-03
    • 2012-02-17
    相关资源
    最近更新 更多