c语言,移位运算符>>

voidmain(){shorta=0xf245,b;b=a>>8;printf("....".......)}请问为什么b=0xfff2,而不是0x00f2... void main()
{
short a=0xf245,b;
b=a>>8;
printf("....".......)
}
请问为什么b=0xfff2,而不是0x00f2
展开
 我来答
百度网友b99f1df
2013-07-31 · TA获得超过216个赞
知道答主
回答量:114
采纳率:100%
帮助的人:73.1万
展开全部
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:10100110 >>5(假设字长为8位),则得到的是 11111101。

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.

所以,short a=0xf245,即a=1111001001000101,经过右移后,b=a>>8;b=1111111111110010,即b=0xfff2。注意是有符号右移为算术右移!!!
追问
谁能告诉我,为什么f245是负的,明明是正的嘛,他又不是-f245
追答
short a=0xf245,即a=1111001001000101,符号位为1,就是负数,负数在计算机内以补码形式存在,而不是-f245这个形式。你可以查看补码等知识
好嘞啊啊啊啊
2013-07-31 · TA获得超过2612个赞
知道大有可为答主
回答量:1860
采纳率:66%
帮助的人:1199万
展开全部
这是有符号的 改成unsigned short a=0xf245 看看
追问
就算是有符号的,它不是正数吗,应该在前面补0啊?
追答
我执行 printf("%d",a);  是-3515 负数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式