在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。
但是,右移位操作存在一个左移位操作不曾面临的问题:从左边移入的位,可以选择两种方案。
一种是逻辑移位,左边移入的位用0填充;
一种是算数移位,左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的为均为0,这样就能够保持原数的正负形式不变。
比如 值10010110,
逻辑右移两位:00100101
算数右移移位:11100101
算数左移和逻辑左移是相同的,都是右边多出来的填充0(需要主要不要溢出),它们只在右移时不同,而只有当操作数是负数时才不一样。
为什么说使用了有符号数右移操作,就不可移植了?
标准说明无符号值的所有移位操作是采用逻辑移位,但对于有符号值,到底时采用逻辑移位还是算数移位取决与编译器,不能保证所有的编译器采用同样的方式。因此,一个程序如果使用的有符号的右移位操作,它是不可移植的。