C 在这种情况下,负0会是一个问题吗?

C 在这种情况下,负0会是一个问题吗?,c,language-lawyer,division,C,Language Lawyer,Division,我有一个简单的问题是出于安全编码的动机 我遇到了一种情况,必须将除法余数或0的负值赋给int变量,因此我使用了以下表示法: int a = -(b % c); 其中b和c都是正整数。表达式(b%c)将产生一个正数或0和a将被分配结果的负值 如果(b%c)产生0,那么-0的计算结果是什么0还是负值0?如果后一种情况发生,会有什么影响 注:我不知道什么是负数0。从二进制角度看,它是0的8N位(取决于平台和编译器),没有任何含义。-(b%c)无法生成负数0,因为c 2018 6.2.6.2 3说:

我有一个简单的问题是出于安全编码的动机

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

int a = -(b % c);
其中
b
c
都是正整数。表达式
(b%c)
将产生一个正数或
0
a
将被分配结果的负值

如果
(b%c)
产生
0
,那么
-0
的计算结果是什么<代码>0还是负值
0
?如果后一种情况发生,会有什么影响

注:我不知道什么是负数
0

从二进制角度看,它是0的8N位(取决于平台和编译器),没有任何含义。

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

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

-
&
|
^
~
和code>运算符,它们的操作数产生这样的值

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

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

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

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


在现代C实现中,整数的负零非常罕见。现代实现绝大多数使用2的补码,它没有负零。只有专门的/历史的/古老的实现可以使用具有负零(一的补码、符号和幅度)的可选整数表示。浮点表示法通常有负零,但在值相等的比较中它们等于正零(最有可能的是
=
!=
=
运算符)。

您必须执行
-1*(b%c)
。据我所知,没有问题,因为它的2的补码表示法对于int是相同的。2的补码表示法不能存储
-0
,它只是
0
,但浮点变量可以存储
-0.0
。根据:“广泛使用的2的补码编码不允许负零。”关于一元
-
的第二段对我来说似乎很奇怪
b%c
不能产生负零,但我认为没有人问过这个问题。我不清楚你想说什么。@user694733:问题是
-(b%c)
是否能产生负零。在该表达式中,
-
是一元运算符(最初错误地称为“一元操作数”;我已经更正了它)。引用的C标准文本似乎是为了讨论第二项中的二进制运算符,因为它提到了“一个操作数”,表明存在多个操作数。然而,即使我们将其应用于一元运算符,它也表示只有当其操作数为负零时,
-
才能产生负零。它的操作数不能是负零,因为它的操作数是
b%c
,在这里不产生负零。8N表示法是什么意思?另外,非2的完整系统呢?请扩展并澄清您的答案。“非2的补码系统”在任何地方都可能有这样的系统和标准,我需要一段时间来扩展这个答案,所以请稍等,而LEC标准只为有符号整数定义了3个系统:2的补码,1的补码,以及符号和大小。最近这两个问题已经过时了,但我认为在回答这个问题时不能忽略它们,因为它标有[语言律师]。