4.5.6 向右移位运算符

顾名思义,向右移位运算符(>>)把值的位向右移动。从值的低位移出的位将丢失。把无符号的值向右移位总是左侧(就是高位)移入0。对于有符号值而言,左侧移入1还是0依赖于被移动数字的符号,还取决于该操作在计算机上的实现方式。如果符号位是0(表示该值是正的),不管哪种机器都将移入0。然而,如果符号位是1,那么在一些计算机上将移入1,而其他计算机上则移入0。前一类型的运算符通常称为算术右移,而后者通常称为逻辑右移。

警告对于系统使用算术右移还是逻辑右移,千万不要进行猜测。如果进行此类的假设,那么在一个系统上可正确进行有符号右移运算的程序,有可能在其他系统上运行失败。如果w1是unsigned int,用32位表示它并且它等于十六进制的F777EE22,那么使用语句w1>>=1;

将w1右移一位后,w1等于十六进制的7BBBF711,如下所示:


w1 1111 0111 0111 0111 1110 1110 0010 0010 0xF777EE22

w1>>1 0111 1011 1011 1011 1111 0111 0001 0001 0x7BBBF711


如果将w1声明为(有符号)的short int,在某些计算机上会得到相同的结果;而在其他计算机上,如果将该运算作为算术右移来执行,结果将会是FBBBF711。

应该注意到,如果试图用大于或等于该数据项的位数将值向左或向右移位,那么该Objective-C语言并不会产生规定的结果。因此,例如计算机用32位表示整数,那么把一个整数向左或向右移动32位或更多位时,并不会在计算机上产生规定的结果。还注意到,如果使用负数对值移位时,结果将同样是未定义的。