====== 移位操作符的注意事项 ====== 移位操作符%%<<%%和%%>>%%的两个操作数必须是整数,与一般二元操作不同的是,两个操作数分别进行[[.:unary_conversions|一元转换]],结果类型为第一操作数转换为的类型。 移位次数(第二操作数)必须大于等于0,且小于被移位数(第一操作数)的bit位数,否则结果是未定义的(undefined)。例如,被移位数是一个32位的int整数,则第二操作数的合法取值范围是0~31。 对于左移%%<<%%运算,左侧移出的位被丢弃,右侧补入0。 对于右移%%>>%%运算,右侧移出的位被丢弃,左侧补入的值依赖于被移位数的类型和编译器实现: * 如果是无符号类型(unsigned)或非负的有符号类型(signed and non-negative),则补入0; * 如果是负数(negative),则可补入0或1,具体依赖于实现。 所以,如果要保证代码的可移植(portable)性,需要特别注意负数右移的情况。 {{tag>C语言}}