有符号数移位

在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。
但是,右移位操作存在一个左移位操作不曾面临的问题:从左边移入的位,可以选择两种方案。
一种是逻辑移位,左边移入的位用0填充
一种是算数移位,左边移入的位由原先该值的符号位决定符号位为1则移入的位均为1,符号位为0则移入的为均为0
这样就能够保持原数的正负形式不变。

比如 值10010110,
逻辑右移两位:00100101
算数右移移位:11100101

算数左移和逻辑左移是相同的,都是右边多出来的填充0(需要主要不要溢出),它们只在右移时不同,而只有当操作数是负数时才不一样。

为什么说使用了有符号数右移操作,就不可移植了?

标准说明无符号值的所有移位操作是采用逻辑移位,但对于有符号值,到底时采用逻辑移位还是算数移位取决与编译器,不能保证所有的编译器采用同样的方式。因此,一个程序如果使用的有符号的右移位操作,它是不可移植的。

posted @ 2021-04-02 17:32  不明白就去明白  阅读(1581)  评论(0编辑  收藏  举报