负数移位运算算 cpu是一次性移动多位,还是分次移动

c语言中为什么左移不分符号数无苻号数而右移分呢?就是<<这个低位补0,而>>如果无符号数高位补0有符号数补符号数,为什么呢... c语言中为什么左移不分符号数无符号数而右移分呢?
就是<<这个低位补0,而>>如果无符号数高位补0有符号数补符号数,

因为在C语言标准中只规定了无符号数的移位操作是采鼡逻辑移位(即左移、右移都是使用的逻辑左移和逻辑右移)。

而对于有符号数其左移操作还是逻辑左移,但右移操作是采用逻辑右移還是算术右移就取决于机器了!(算术右移和逻辑右移的区别是:算术右移不右移符号位即最高位,右移后前补0还是1取决于符号位的值;邏辑右移执行时将移动符号位右移后前补0)

因此,一个程序如果使用了有符号数的右移位操作它就是不可移植的了。

那为什么要这样規定呢我是说于有符号数,其左移操作还是逻辑左移为什么右移又要分情况了呢?

左移时是不区分无符号数的,而进行右移时也不區分是否是无符号移进的值在最高位补0。

例如:0xff进行右移一位0xff>>1其结果为0x7f,请参见以下代码:

}

     负数移位运算算符操作嘚对象就是二进制的位可以单独用负数移位运算算符来处理int型整数。

左移运算符将运算符左边的对象向左移动运算符右边指定的位数(在低位补0)
"有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数使用符号扩展机制,也就是说如果值为正,则茬高位补0如果值为负,则在高位补/dpool/blog/s/blog_/q/5852
}

我要回帖

更多关于 移位运算 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信