c语言中为什么左移不分符号数无符号数,而右移分呢??

[复制链接]
查看11 | 回复2 | 2011-9-25 12:32:17 | 显示全部楼层 |阅读模式
c语言中为什么左移不分符号数无符号数,而右移分呢??就是这个低位补0,而如果无符号数高位补0,有符号数补符号数,为什么呢
回复

使用道具 举报

千问 | 2011-9-25 12:32:17 | 显示全部楼层
因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移、右移都是使用的逻辑左移和逻辑右移)。而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!(算术右移和逻辑右移的区别是:算术右移不右移符号位,即最高位,右移后前补0还是1取决于符号位的值;逻辑右移执行时将移动符号位,右移后前补0)因此,一个程序如果使用了有符号数的右移位操作,它就是不可移植的了。追问那为什么要这样规定呢,我是说于有符号数,其左移操作还是逻辑左移,为什么右移又要分情况了呢??
回复

使用道具 举报

千问 | 2011-9-25 12:32:17 | 显示全部楼层
计算机中存放的是二进制补码表示的,正数的补码是本身,而负数的补码是取反加1.所以负数的补码在求其真值是也是对其作取补运算。左移、右移其实就是乘或除2,这个不影响符号,所以负数的右移补符号位,保证是负数。这只是大道理,您自己推一下就很容易理解了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行