通过


按位移位运算符

移位运算符按第二个作数指定的位置数向左(<<)或右(>>)移动第一个作数。

语法

shift-expression:
additive-expression
shift-expression << additive-expression
shift-expression >> additive-expression

这两个作数必须是整型值。 这些运算符执行通常的算术转换;结果的类型是转换后左作数的类型。

对于向左移,空出的右位设置为 0。 对于向右移,根据转换后的第一个作数的类型填充空出的左位。 如果类型为 unsigned,则它们设置为 0。 否则,它们会填充符号位的副本。 对于不溢出的左移运算符,语句

expr1 << expr2

等效于乘以2 expr2。 对于右移运算符,

expr1 >> expr2

如果expr1为 unsigned 或具有非负值,则等于除以2 expr2

如果第二个作数为负,或者右作数大于或等于提升左作数的位的宽度,则未定义 Shift作的结果。

由于班次运算符执行的转换不提供溢出或下溢条件,因此如果转换后第一个作数的类型无法表示班次作的结果,则信息可能会丢失。

unsigned int x, y, z;

x = 0x00AA;
y = 0x5500;

z = ( x << 8 ) + ( y >> 8 );

在此示例中, x 左移 8 个位置,右 y 移 8 个位置。 添加了移位值,为0xAA55赋值并赋给 z

将负值移到右侧将产生原始值的一半,向下舍入。 例如,-253(二进制11111111 00000011)右移一位生成 -127(二进制11111111 10000001)。 正 253 将右移以生成 +126。

右移保留符号位。 当有符号整数向右移动时,最重要的位将保持设置。 当无符号整数向右移动时,清除最重要的位。

另请参阅

左移和右移运算符 (>> 和 <<)