int pcount_r (unsigned x) {
if(x==0)
return 0;
else
return ((x & 1) + pcount_r(x >> 1));
}
只是想知道为什么输入参数是无符号的。
最好的祝福!
int pcount_r (unsigned x) {
if(x==0)
return 0;
else
return ((x & 1) + pcount_r(x >> 1));
}
只是想知道为什么输入参数是无符号的。
最好的祝福!
E1 >> E2
当 E1 具有带符号类型和负值 (C99 6.5.7:5) 时产生的结果是实现定义的。另一方面,E1 >> E2
由标准明确定义。接受和操作无符号整数是使函数最可移植的一种方法。
顺便说一句,通常使用无符号类型进行位旋转。
如果数字有符号,则右移将复制符号位(最后一位),从而有效地为负数提供无限位数。
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);
}
问题是 C(与 Java 不同)不支持有符号(算术)移位。CPU 有两种不同类型的移位运算符,有符号和无符号。例如,在 x86 上,SAR 指令执行算术右移,而 SHR 执行无符号右移。由于 C 语言只有一个右移运算符 (>>),因此不能同时支持这两种运算符。如果编译器使用无符号移位 (SHR) 实现上述代码,并且您向该过程提供负数,您将得到错误的答案。