【问题标题】:Shifting a 32 bit integer by 32 bits将 32 位整数移位 32 位
【发布时间】:2013-09-18 21:51:02
【问题描述】:

我正在编写一些 C 代码,我需要将 32 位 int 左移 32 位。当我使用参数 n = 0 运行此代码时,不会发生移位。

int x = 0xFFFFFFFF;
int y = x << (32 - n);

为什么这不起作用?

【问题讨论】:

标签: c bit-shift bits low-level


【解决方案1】:

转移后果自负。根据标准,您要做的是未定义的行为

C99 §6.5.7

3 - 对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

换句话说,如果您尝试将 32 位值移动超过 31 位或负数,您的结果是不确定的。

【讨论】:

    【解决方案2】:

    根据draft of C89 (?) standard 中的3.3.7 位移运算符部分:

    如果右操作数的值为负数或大于或等于提升的左操作数的位宽度,则行为未定义。

    假设 int 在您正在编译代码的系统上是 32 位的,当 n 为 0 时,您正在移动 32 位。根据上面的陈述,您的代码会导致未定义的行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      相关资源
      最近更新 更多