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

mac*_*e_1 3 c division language-lawyer

我有一个由安全编码激发的简单问题。

我遇到的情况下我必须分配除法的余数或的负值0到一个int变量,所以就用了以下符号:

int a = -(b % c);
Run Code Online (Sandbox Code Playgroud)

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

如果(b % c)yield 0-0评估结果是什么?0还是负面的0?如果后者发生,会有什么影响?

PS我不知道负面0是什么。

Eri*_*hil 6

-(b % c) 不能产生负 0 因为 C 2018 6.2.6.2 3 说:

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

-所述&|^~<<,和>>与产生这样的一个值的操作数操作符;

-所述+-*/,和%运营商,其中一个操作数是负零,其结果是零;

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

即使我们将上面解释为包含-为一元运算符,我们也已经给出了bc是正整数,因此b % c不能产生负零,因此-in的操作数-(b % c)不是负零。

如果==用于比较负零和非负零,它会产生真,因为==操作基于操作数的值,而不是它们的表示。

在现代 C 实现中,整数的负零非常罕见。现代实现绝大多数使用二进制补码,它没有负零。只有专门的/历史的/古老的实现可能会使用具有负零(一个的补码和符号和大小)的替代整数表示。浮点表示通常具有负零,但它们等于由价值相等比较积极的零(在==!=<><=,和>=运营商)。