C如何处理一个补码架构中的数字0?

C如何处理一个补码架构中的数字0?,第1张

概述我最近一直在研究表示数字的一个补码系统,根据我的理解,数字0有两个变量.有一个负零(-0)和一个正零(0). 我的问题是,在一个补码架构中,这个异常在C中究竟是如何处理的? C是否区分-0和0,或者这两种形式都被视为零. 如果是0和-0在测试为零时返回TRUE的情况,那么我想知道如果我们输入-0作为其输入,下面的示例代码将如何工作以计算整数中的设置位数. int bitcount(int x){ 我最近一直在研究表示数字的一个补码系统,根据我的理解,数字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的特殊性.

解决方法 实现定义是否在补码结构上,“带符号位和所有值位1”的值是“陷阱表示”还是正常值.如果它是一个陷阱表示,任何尝试对它做任何事情,或者甚至首先创建它,都会引发未定义的行为.如果它是一个正常值,它是一个“负零”,并且有一个明确的 *** 作列表允许产生它:

If the implementation supports negative zeros,they shall be generated only by:

the &,|,^,~,<<,and >> operators with operands that produce such a value; the +,-,*,/,and % operators where one operand is a negative zero and the result is zero; compound assignment operators based on the above cases.

It is unspecifIEd whether these cases actually generate a negative zero or a normal zero,and whether a negative zero becomes a normal zero when stored in an object.

(C11 / N1570,第6.2.6.2节,第3段)

似乎未指明(通过省略)负零比较等于正常零.类似的规则适用于符号和大小的体系结构.

因此,归结为,示例代码的行为是实现定义的,并且实现可能无法有用地定义它.您需要查阅这个假设的补充机器的编译器和体系结构手册,以确定它是否符合您的要求.

然而,整个问题没有实际意义,因为至少25年来没有人制造过非二进制补充cpu.人们希望C标准的未来修订将不再允许这种可能性;它会简化许多事情.

总结

以上是内存溢出为你收集整理的C如何处理一个补码架构中的数字0?全部内容,希望文章能够帮你解决C如何处理一个补码架构中的数字0?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217769.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存