2010-09-13 157 views
8

寻求澄清的东西。逻辑,算术按位移

这是我的理解,关于算术,逻辑逐位的变化:

  1. <<工作相同的两个
  2. >>转变在逻辑移位与0差异总是会填充字节,而算术移位将填充符号位。

如何区分这使用C?

据我了解,实际经营者是同一<<>>

将如何指挥差异之间:

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

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

请让我知道,

回答

13

在为非负数的情况下,两个种类的右移是相同的。只有当移动的数字是负数时才会出现差异。

实际上C标准没有指定何时>>执行逻辑或算术移位时,数字是负数,但通常,它执行算术移位。为了执行逻辑移位,数必须被转换为相应的无符号类型,for example

int x = -2; 
int y = x >> 1; // arithmetic shift. 
assert (y == -1); 
int z = (unsigned)x >> 1; // logical shift. 
assert (z == 0x7FFFFFFF); 
+0

有一种方法强制特定偏移。例如,我想(x <<1)>> 1为了删除“ - ”符号 – JAM 2010-09-13 18:00:21

+0

@Jerry,@mac:查看更新 – kennytm 2010-09-13 18:02:10

+1

@mac:丢弃符号位与采用绝对位置不一样值得用补码 – jamesdlin 2010-09-13 18:05:52