【问题标题】:Unexpected behavior while dealing with shift operators处理班次操作员时的意外行为
【发布时间】:2014-09-01 19:25:10
【问题描述】:

我的程序写在下面:

void main() {
   int n =0;
   printf("%x", (~0 << (32+ (~n +1) )));
}

由于n = 0,~n = 0xffffffff == -1,所以~n + 1 等于0。 当我执行这个程序时,我得到 0xffffffff,这是不正确的,因为 (~0

当我用 0 替换 (~n +1) 时,它输出 0。

非常感谢任何帮助。

【问题讨论】:

标签: c bit-manipulation bit-shift


【解决方案1】:

您正在将 32 位宽的值移动 32 位。
结果是未定义的,据你所知,它可能等于蘑菇千层面。

[C99: 6.5.7/3]: 整数提升在每个操作数上执行。结果的类型是提升的左操作数的类型。 如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

那么,任何进一步的分析都是愚蠢的。

【讨论】:

  • 谢谢!我读过那个条款,但我不明白为什么这两种情况下的行为都是一致的。
  • @KumarVikramjeet:你的意思是不一致? IIRC,在 x86 上,只有右操作数的 5 个最低位用于 32 位类型的移位。如果你写一个文字 0,例如Gcc 在编译时计算表达式(结果不同)。当我用gcc -O1 编译你的代码时也会发生同样的情况(Gcc 可以推断出~n+1 是0)。
  • @KumarVikramjeet:因为我回答的最后一行。
  • @Mafso 我的意思是为什么这两种情况下的行为是一致的。没关系,你说的我明白了,谢谢!
  • 请注意,将 ~0 左移 任何 位数(0 除外)会导致未定义的行为。
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2011-09-09
  • 2011-01-01
相关资源
最近更新 更多