问题十,取反运算符与左移和右移运算符的优先级问题。

时间:2021-07-28 19:11:12
问题十:unsigned getbits(unsigned value,int  n2,int n2)
{unsigned a,d,f;
a=~0;
d=(a>>n2)^(a>>(n1-1));
printf("d=%d",d);
f=d&value;
return f>>(16-n2);
}
main()
{unsigned value;
int n1,n2;
unsigned back;
scanf("%d%d%d",&value,&n1,&n2);
back=getbits(value,n1,n2);
printf("\nback value is %d",back);
}
这个程式运行起来是没有问题的。但是如果进行如下的改动就有问题了。
unsigned getbits(unsigned value,int  n2,int n2)
{unsigned d,f;
d=(~0>>n2)^(~0>>(n1-1));
printf("d=%d",d);
f=d&value;
return f>>(16-n2);
}
main()
{unsigned value;
int n1,n2;
unsigned back;
scanf("%d%d%d",&value,&n1,&n2);
back=getbits(value,n1,n2);
printf("\nback value is %d",back);
这样改的话运行就得不到正确的结果。
而很明显,取反运算符的优先级要比左移和右移的运算级要高,这是为什么呢?

3 个解决方案

#1


关注

#2


不是优先级的问题。
改成如下形式就可以了
d=(~(unsigned)0>>n2)^(~(unsigned)0>>(n1-1));
主要是默认情况下0是有符号整数。

#3


Roger that!

对了,怎么把分加给你呢?我心飞翔。

#1


关注

#2


不是优先级的问题。
改成如下形式就可以了
d=(~(unsigned)0>>n2)^(~(unsigned)0>>(n1-1));
主要是默认情况下0是有符号整数。

#3


Roger that!

对了,怎么把分加给你呢?我心飞翔。