移位运算符按第二个作数指定的位置数向左(<<)或右(>>)移动第一个作数。
语法
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。
右移保留符号位。 当有符号整数向右移动时,最重要的位将保持设置。 当无符号整数向右移动时,清除最重要的位。