【问题标题】:How do I perform a signed right shift(>>) in c?如何在 c 中执行有符号右移(>>)?
【发布时间】:2019-06-25 00:57:04
【问题描述】:

如何在 c 中执行有符号右移? 比如 -25 >> 3。

我试过这样: 10011001 >> 3 == 00010011

但结果是-4。

【问题讨论】:

  • 在这里您可以找到与您的问题相关的好答案:stackoverflow.com/questions/7622/…
  • -25 在 2 的补码系统上不是 10011001(即几乎所有)。它是 11100111。
  • 10011001 base 2 是 99。示例“我试过这样:10011001 >> 3 == 00010011”不清楚。

标签: c bit-manipulation signed


【解决方案1】:

一个有符号的右移。在有符号移位中,负数(由最高位中的“1”标识)通常从左侧填充。 (尽管这取决于特定的编译器。看起来这就是您的编译器正在做的事情。) 11100111 --> 11110011 --> 11111001 --> 11111100

听起来您正在寻找的是一个无符号的转变。如果您使用(signed char)(((unsigned char)-25)>>3),您可能会得到您想要的结果。

【讨论】:

  • OP 的示例对应于unsigned uint8_t 而不是unsigned short
  • 我的电脑里是-4,但是11110011的小数点是115
  • @chen 如果它被转换回签名字符,我怀疑它会是-4。
  • @interjay。你说得对。 char,不短。将修复。但是unsigned uint8_t 有点多余。 :)
  • 负值的右移如何操作在 C 中由实现定义; C 标准不要求符号扩展。
【解决方案2】:

由于有符号整数的右移是根据我的经验定义的实现,因此结果取决于目标机器上算术移位的可用性。因为现在很难找到没有它的任何计算机或 uC,几乎总是算术右移的结果

来自维基百科:

【讨论】:

    【解决方案3】:

    根据标准 6.5.7p5

    E1 >> E2 的结果是 E1 右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有有符号类型和非负值,则结果的值是 E1 /2E2 商的整数部分。如果 E1 具有带符号类型和负值,则结果值是实现定义的。

    结果是实现定义的,你应该看看它是如何定义的。

    假设二进制补码和有符号右移,-2511100111,将其移动 3 将导致 11111100-4

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      相关资源
      最近更新 更多