寻求澄清一些事情。
据我了解,关于算术、逻辑位移:
<<
两者都一样>>
移位的不同之处在于逻辑移位将始终用 0 填充字节,而算术移位将用符号位填充它。
如何使用 C 区分这一点?
据我了解,实际操作员是相同的<<
,>>
命令在以下方面有何不同:
int i=1;
printf ("%d\n", i >> 1); // logical shift
int j=1;
printf ("%d\n", j >> 1); // arithmetical shift
请告诉我,
寻求澄清一些事情。
据我了解,关于算术、逻辑位移:
<<
两者都一样>>
移位的不同之处在于逻辑移位将始终用 0 填充字节,而算术移位将用符号位填充它。如何使用 C 区分这一点?
据我了解,实际操作员是相同的<<
,>>
命令在以下方面有何不同:
int i=1;
printf ("%d\n", i >> 1); // logical shift
int j=1;
printf ("%d\n", j >> 1); // arithmetical shift
请告诉我,
在非负数的情况下,两种右移是相同的。仅当要移位的数字为负时,才会出现差异。
实际上,C 标准没有指定当>>
数字为负数时应该何时执行逻辑或算术移位,但通常会执行算术移位。要执行逻辑移位,必须将数字转换为相应的无符号类型,例如:
int x = -2;
int y = x >> 1; // arithmetic shift.
assert (y == -1);
int z = (unsigned)x >> 1; // logical shift.
assert (z == 0x7FFFFFFF);