4

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

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

为什么这不起作用?

4

2 回答 2

11

转移风险自负。根据标准,您想要做的是undefined behavior

C99 §6.5.7

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

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

于 2013-09-14T07:23:38.440 回答
3

根据C89 (?) 标准草案中的3.3.7 节按位移位运算符

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

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

于 2013-09-14T07:23:28.307 回答