3
int pcount_r (unsigned x) {
    if(x==0)
        return 0;
    else
        return ((x & 1) + pcount_r(x >> 1));
}

只是想知道为什么输入参数是无符号的。

最好的祝福!

4

3 回答 3

3

E1 >> E2当 E1 具有带符号类型和负值 (C99 6.5.7:5) 时产生的结果是实现定义的。另一方面,E1 >> E2由标准明确定义。接受和操作无符号整数是使函数最可移植的一种方法。

顺便说一句,通常使用无符号类型进行位旋转。

于 2012-10-25T19:19:12.553 回答
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);
}
于 2012-10-25T19:38:49.173 回答
-2

问题是 C(与 Java 不同)不支持有符号(算术)移位。CPU 有两种不同类型的移位运算符,有符号和无符号。例如,在 x86 上,SAR 指令执行算术右移,而 SHR 执行无符号右移。由于 C 语言只有一个右移运算符 (>>),因此不能同时支持这两种运算符。如果编译器使用无符号移位 (SHR) 实现上述代码,并且您向该过程提供负数,您将得到错误的答案。

于 2012-10-25T19:42:18.820 回答