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

c语言中为什么左移不分符号数无符号数,而右移分呢??就是<<这个低位补0,而>>如果无符号数高位补0,有符号数补符号数,为什么呢... c语言中为什么左移不分符号数无符号数,而右移分呢??
就是<<这个低位补0,而>>如果无符号数高位补0,有符号数补符号数,
为什么呢
展开
 我来答
freely_1985
2015-05-21 · TA获得超过1190个赞
知道小有建树答主
回答量:2807
采纳率:42%
帮助的人:443万
展开全部

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

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

#include <stdio.h>

int main()
{
    int a = 0xff;
    a = a >> 1;
    printf("a = %x\n", a);
    return 0;
}
运行结果为:a = 7f
百度网友caf0e00
2020-07-18
知道答主
回答量:4
采纳率:0%
帮助的人:1.2万
展开全部
因为左移定义是,每个移出的位进入进位标志,右边填充0,无论是有符号数还是无符号数都这么操作,这是规定。那么,这样的操作对有符号数和无符号数的结果都是一样的,所以左移不分有符号数还是无符号数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
10伯乐01
2011-09-12 · TA获得超过501个赞
知道小有建树答主
回答量:95
采纳率:0%
帮助的人:102万
展开全部
计算机中存放的是二进制补码表示的,正数的补码是本身,而负数的补码是取反加1.
所以负数的补码在求其真值是也是对其作取补运算。

左移、右移其实就是乘或除2,这个不影响符号,所以负数的右移补符号位,保证是负数。

这只是大道理,您自己推一下就很容易理解了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
忠盛然383
2011-09-13 · TA获得超过1069个赞
知道答主
回答量:294
采纳率:100%
帮助的人:165万
展开全部

因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移、右移都是使用的逻辑左移和逻辑右移)。
而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!(算术右移和逻辑右移的区别是:算术右移不右移符号位,即最高位,右移后前补0还是1取决于符号位的值;逻辑右移执行时将移动符号位,右移后前补0)
因此,一个程序如果使用了有符号数的右移位操作,它就是不可移植的了。
追问
那为什么要这样规定呢,我是说于有符号数,其左移操作还是逻辑左移,为什么右移又要分情况了呢??
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式