在这种情况下,负0会成为问题吗?

问题描述

我有一个简单的问题,受安全编码的启发。

我遇到一种情况,我必须将除法余数或0的负值分配给int变量,因此我使用以下表示法:

int a = -(b % c);

其中bc均为正整数。表达式(b % c)将产生一个正数,或者表达式0a将被赋予负数。

如果(b % c)产生0-0会得出什么结果? 0或否定的0?如果后者发生的话会有什么影响?

P.S我不知道负0是什么。

解决方法

-(b % c)无法生成负0,因为C 2018 6.2.6.2 3说:

如果实现支持负零,则只能通过以下方式生成它们:

-&|^~<<>>运算符,其操作数产生这样的值;

-+-*/%运算符,其中一个操作数为负零,结果为零; / p>

-基于上述情况的复合赋值运算符。

即使我们将以上内容解释为将-包含为一元运算符,我们也已经知道bc是正整数,所以b % c不能产生一个负零,因此--(b % c)的操作数不是负零。

如果使用==比较负零和非负零,则会产生true,因为==会根据操作数的值而不是它们的表示进行操作。

负数在现代C实现中对于整数极为罕见。现代实现绝大多数使用二进制补码,该补码不具有负零。只有专业的/历史的/过时的实现才可以使用带有负零(一个补码和一个符号和一个量级)的替代整数表示形式。浮点表示形式通常具有负零,但在按值相等的比较中,它们等于正零(==!=<>,{{ 1}}和<=运算符)。

,

二进制方式是8N(取决于平台和编译器)位0s,没有任何含义。