int pcount_r (unsigned x) {
if(x==0)
return 0;
else
return ((x & 1) + pcount_r(x >> 1));
}
只是想知道为什么输入参数是无符号的。
最好的问候!答案 0 :(得分:3)
当E1具有有符号类型和负值(C99 6.5.7:5)时,它是E1 >> E2
生成的实现定义。另一方面,E1 >> E2
由标准明确定义。接受和操作无符号整数是使函数最便携的一种方法。
顺便说一下,通常使用无符号类型进行比特纠缠。
答案 1 :(得分:2)
如果数字是有符号的,那么右移将复制符号位(最后一位),有效地给出负数无限位。
int pcount_r(int x) {
if (x == 0)
return 0;
else if (x < 0)
return sizeof(int)*8 - pcount_r(~x);
else
return (x & 1) + pcount_r(x >> 1);
}
答案 2 :(得分:-2)
问题是C(与Java不同)不支持签名(算术)转换。 CPU有两种不同类型的移位运算符,有符号和无符号。例如,在x86上,SAR指令向右移动算术,SHR向右执行无符号移位。由于C只有一个右移运算符(&gt;&gt;),因此它不能同时支持它们。如果编译器使用无符号移位(SHR)实现上面的代码,并且您为该过程提供负数,则会得到错误的答案。