我的问题是,在一个补码架构中,这个异常在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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)