以前一直认为C/C++中的右移操作全部是在左侧补0,今天看到LOWORD宏和HIWORD宏的源代码时, 想起了C/C++中移位的问题,所以编了个小程序试验了一下,发现以前的认识有问题。今天得出的正确结论用一句话来概括就是:C/C++中移位操作完全等同于汇编中的“算术移位指令”,而不等同于“逻辑移位指令”!
具体来说,左移全部是补0,这毫无疑问!在右移操作中,最左侧补0还是补1,完全取决于操作数本身是不是符号数。如果是无符号数,则全部是补0,如果是有符号数,则补符号位上的数字,负数补1,正数补0;也就是说,对于有符号数,无论怎么移,符号位保持不变!!!