我最近一直在研究表示数字的补码系统,据我了解,数字 0 有两种变体。有一个负零 (-0) 和一个正零 (+0)。
我的问题是,在一个补码架构上,这个异常在 C 中究竟是如何处理的?C 是区分 -0 和 +0 还是将这两种形式都简单地视为零。
如果在测试为零时 +0 和 -0 都返回 TRUE,那么我想知道如果我们输入 -0 作为其输入,以下示例代码将如何计算整数中设置的位数。
int bitcount(int x)
{
int b;
for (b = 0; x != 0; b++)
x &= (x-1);
return b;
}
由于 -0 在一个补码中将其所有位设置为 1,因此 -0 应该返回任何其他数字中设置的最高位数;但是,该代码似乎无法通过 的循环测试条件x != 0
,甚至不会进入循环,从而给出不正确的结果。
是否有可能在 C 中,在一个补码体系结构中,使循环条件对正零敏感,如下所示:x != +0
另外,如果我从 +0 中减去 1,我会得到 -0 还是 -1。换句话说,+0 - 1 = -0 在一个补码体系结构中吗?
总而言之,为了在这个讨论中不要走得太远,我只是想知道 C 如何处理一个补码体系结构中数字 0 的特性。