【问题标题】:Would negative 0 be an issue in this situation?在这种情况下,负 0 会成为问题吗?
【发布时间】:2020-10-29 12:20:12
【问题描述】:

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

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

int a = -(b % c);

bc 都是正整数。表达式(b % c) 将产生一个正数,或者0a 将被赋予结果的负值。

如果(b % c) 产生0-0 的计算结果是什么? 0 还是否定的0?如果后者发生,会有什么影响?

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

【问题讨论】:

  • 你很可能必须做-1*(b%c)。据我所知,没有问题,因为它的二进制补码表示对于整数是相同的。
  • 二进制补码不能存储-0,它只是0,但是浮点变量可以存储-0.0
  • 根据Wikipedia:“广泛使用的二进制补码编码不允许负零。”

标签: c language-lawyer division


【解决方案1】:

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

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

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

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

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

即使我们将上述解释为包含- 作为一元运算符,我们已经给出bc 是正整数,所以b % c 不能产生负零,所以@ 的操作数-(b % c) 中的 987654337@ 不是负零。

如果== 用于比较负零和非负零,则结果为真,因为== 基于操作数的值而不是它们的表示进行运算。

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

【讨论】:

  • 第二段关于一元 - 对我来说似乎很奇怪。 b % c 不能产生负零,但我认为没有被问到。我不清楚你想表达什么观点。
  • @user694733:问题是问-(b % c) 是否可以产生负零。在那个表达式中,- 是一个一元运算符(原来错误地说是“一元操作数”;我已经更正了)。引用的 C 标准文本似乎是为了讨论第二项中的二元运算符,因为它提到“一个操作数”,表明存在不止一个。但是,即使我们将其视为应用于一元运算符,它也表示 - 只有在其操作数为负零时才能产生负零。它的操作数不能是负零,因为它的操作数是b % c,这里不会产生负零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多