为什么人口计数的输入参数必须是无符号的

时间:2012-10-25 19:10:53

标签: c algorithm assembly count population

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

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

最好的问候!

3 个答案:

答案 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)实现上面的代码,并且您为该过程提供负数,则会得到错误的答案。