移位运算符按第二个操作数指定的位置数量向左 (<<
) 或向右 (>>
) 移动第一个操作数。
语法
shift-expression
?
additive-expression
shift-expression
<<
additive-expression
shift-expression
>>
additive-expression
两个操作数都必须是整数值。 这些运算符执行常用算术转换;结果的类型是转换后左操作数的类型。
对于左移,留空的右位将设置为 0。 对于右移,将根据转换后第一个操作数的类型填充留空的左位。 如果类型是 unsigned
,则将留空的左位设置为 0。 否则,将使用符号位的副本填充它们。 对于没有溢出的左移运算符,语句
expr1 << expr2
等效于乘以 2expr2。 对于右移运算符,
expr1 >> expr2
等效于除以 2expr2(如果 expr1
为无符号或具有非负值)。
如果第二个操作数为负,或者右操作数大于或等于提升后的左操作数的宽度(以位为单位),则移位运算的结果不确定的。
由于没有为溢出或下溢情况提供移位运算符执行的转换,因此当移位运算的结果不能用转换后第一个操作数的类型表示时,信息可能丢失。
unsigned int x, y, z;
x = 0x00AA;
y = 0x5500;
z = ( x << 8 ) + ( y >> 8 );
在此示例中,x
将向左移位 8 个位置,y
将向右移位 8 个位置。 移位值(假定 0xAA55)将相加并赋给 z
。
将负值向右移位可生成原始值一半的值(向下舍入)。 例如,-253(二进制 11111111 00000011)向右移动 1 位会生成 -127(二进制 11111111 10000001)。 将 + 253 向右移位生成 +126。
右移保留符号位。 当带符号的整数向右移位时,最高有效位将保留。 当无符号的整数右移位时,将清除最高有效位。