Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么人口计数的输入参数必须是无符号的_C_Algorithm_Assembly_Count_Population - Fatal编程技术网

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

C 为什么人口计数的输入参数必须是无符号的,c,algorithm,assembly,count,population,C,Algorithm,Assembly,Count,Population,只是想知道为什么输入参数是无符号的 致以最良好的祝愿 当E1具有有符号类型和负值(C99 6.5.7:5)时,E1>>E2产生的内容由实现定义。另一方面,E1>>E2由标准明确定义。接受无符号整数并对其进行操作是使函数最具可移植性的一种方法 顺便说一句,通常使用无符号类型进行位旋转。如果数字是有符号的,则右移将复制符号位(最后一位),从而使负数具有无限位数 int pcount_r (unsigned x) { if(x==0) return 0; else

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


致以最良好的祝愿

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


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

如果数字是有符号的,则右移将复制符号位(最后一位),从而使负数具有无限位数

int pcount_r (unsigned x) {
    if(x==0)
        return 0;
    else
        return ((x & 1) + pcount_r(x >> 1));
}
intpcount\r(intx){
如果(x==0)
返回0;
else如果(x<0)
返回大小f(int)*8-pcount\r(~x);
其他的
返回(x&1)+pcount\r(x>>1);
}

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

右移位和符号位!da Dac应该解释得更清楚,对于傻瓜,我mean@DanielGómezJurado
int>>shift==crap
但是
unsigned>>shift==rulez
相反-如果它使用了
shr
,它总是正确的。当使用
sar
且输入设置了符号位时,问题就出现了。算法永远不会终止。“C只有一个右移位运算符(>>),它不能同时支持这两个运算符”我不明白这与“C只有一个加法(+),所以它不能同时支持整数和浮点”有什么不同。事实上,编译器可以选择将
>
编译成SAR或SHR,其方法是应用完全相同的规则来确定是否需要整数或浮点计算。C99 6.3.1.8:“许多期望算术类型的操作数的运算符会以类似的方式导致转换并产生结果类型。其目的是确定一种常见的实数类型…”@harold如果使用SAR,则程序将正确终止,因为SAR的1/2=0。如果使用SHL,则程序也将终止,但会给出错误的答案,因为符号位将在计数中加一。@TylerDuden 1>>1=0,但-1>>1=-1(带
sar
)。至于符号位加一,好吧,它是开的,所以你必须计算它,对吗?@Pascal Cuoq C标准没有定义如何解释“>>”。这是因为在过去,“>>”在CPU上直接映射到SHR,在某些CPU上是算术移位,而在另一些CPU上是无符号移位,因此无法预测结果。是的。我现在才明白:D,只有一个问题,在->pcount\u r(~x)中,~
~
(“按位不”)是什么意思,它将反转数字的所有位,包括符号位。
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);
}