问题描述
我遇到一种情况,我必须将除法余数或0
的负值分配给int
变量,因此我使用以下表示法:
int a = -(b % c);
其中b
和c
均为正整数。表达式(b % c)
将产生一个正数,或者表达式0
和a
将被赋予负数。
如果(b % c)
产生0
,-0
会得出什么结果? 0
或否定的0
?如果后者发生的话会有什么影响?
P.S我不知道负0
是什么。
解决方法
-(b % c)
无法生成负0,因为C 2018 6.2.6.2 3说:
如果实现支持负零,则只能通过以下方式生成它们:
-
&
,|
,^
,~
,<<
和>>
运算符,其操作数产生这样的值;-
+
,-
,*
,/
和%
运算符,其中一个操作数为负零,结果为零; / p>-基于上述情况的复合赋值运算符。
即使我们将以上内容解释为将-
包含为一元运算符,我们也已经知道b
和c
是正整数,所以b % c
不能产生一个负零,因此-
中-(b % c)
的操作数不是负零。
如果使用==
比较负零和非负零,则会产生true,因为==
会根据操作数的值而不是它们的表示进行操作。
负数在现代C实现中对于整数极为罕见。现代实现绝大多数使用二进制补码,该补码不具有负零。只有专业的/历史的/过时的实现才可以使用带有负零(一个补码和一个符号和一个量级)的替代整数表示形式。浮点表示形式通常具有负零,但在按值相等的比较中,它们等于正零(==
,!=
,<
,>
,{{ 1}}和<=
运算符)。
二进制方式是8N(取决于平台和编译器)位0s,没有任何含义。