【问题标题】:Bitshift operation with signed and unsigned带符号和无符号的位移操作
【发布时间】:2013-09-05 08:38:12
【问题描述】:

我正在对 int 进行移位操作,但对它没有按预期输出感到惊讶。

int i, res;
i = 0x80000000;
res = i>>1;                //results in 0xc0000000
res = (unsigned int) i>>1; //results in 0x40000000

整数中的一位移位怎么可能只对第 31 位起作用?

【问题讨论】:

  • 您确定您的 cmets 正确吗?是不是0xc0000000 而不是0x0c000000
  • 两者是一样的
  • 注意:在0x80000000;中设置了MSB
  • @thebaconing:不一样——数一数零的个数。
  • @thebaconing 在0xc0000000 MSB 是1 而在0x0c0000000

标签: c++ c visual-c++ visual-studio-2005


【解决方案1】:

你看到的可能是arithmetic bit shift

当向右移动时,最左边的位(通常是 有符号整数表示)被复制以填充所有 空缺职位(这是一种符号扩展)。

C99 standard 6.5.7§5 说:

E1 >> E2 的结果是 E1 右移 E2 位位置。 [...] 如果 E1 具有带符号类型和负值,则结果值 是实现定义的。

所以结果可能是编译器编写者决定的任何结果。他们可能决定扩展符号位,编译器文档应该提到它。

【讨论】:

  • 实现定义意味着结果是根据编译器的文档定义的更精确
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 2016-01-24
  • 2023-04-05
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多