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 展开
{
short a=0xf245,b;
b=a>>8;
printf("....".......)
}
请问为什么b=0xfff2,而不是0x00f2 展开
展开全部
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:10100110 >>5(假设字长为8位),则得到的是 11111101。
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
所以,short a=0xf245,即a=1111001001000101,经过右移后,b=a>>8;b=1111111111110010,即b=0xfff2。注意是有符号右移为算术右移!!!
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
所以,short a=0xf245,即a=1111001001000101,经过右移后,b=a>>8;b=1111111111110010,即b=0xfff2。注意是有符号右移为算术右移!!!
追问
谁能告诉我,为什么f245是负的,明明是正的嘛,他又不是-f245
追答
short a=0xf245,即a=1111001001000101,符号位为1,就是负数,负数在计算机内以补码形式存在,而不是-f245这个形式。你可以查看补码等知识
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询