9

寻求澄清一些事情。

据我了解,关于算术、逻辑位移:

  1. <<两者都一样
  2. >>移位的不同之处在于逻辑移位将始终用 0 填充字节,而算术移位将用符号位填充它。

如何使用 C 区分这一点?

据我了解,实际操作员是相同的<<>>

命令在以下方面有何不同:

int i=1;
printf ("%d\n", i >> 1); // logical shift

int j=1;
printf ("%d\n", j >> 1); // arithmetical shift

请告诉我,

4

1 回答 1

15

在非负数的情况下,两种右移是相同的。仅当要移位的数字为负时,才会出现差异。

实际上,C 标准没有指定当>>数字为负数时应该何时执行逻辑或算术移位,但通常会执行算术移位。要执行逻辑移位,必须将数字转换为相应的无符号类型,例如

int x = -2;
int y = x >> 1;    // arithmetic shift.
assert (y == -1);
int z = (unsigned)x >> 1;  // logical shift.
assert (z == 0x7FFFFFFF);
于 2010-09-13T17:54:56.323 回答