什么时候写“0 - x”而不是“-x”有用?

时间:2021-08-01 21:11:59

标签: c subtraction idioms negative-number

我偶尔注意到一些 C 代码坚持使用 0 - x 来获得 x 的附加补码,而不是编写 -x。现在,我认为这些对于小于 int 的类型并不等效(edit:不,即使那时显然等效),但除此之外 - 前者有什么好处而不是后一种形式?

2 个答案:

答案 0 :(得分:4)

tl;dr:0-x 可用于清除浮点零的符号。

(正如@Deduplicator 在评论中指出的:)

我们中的许多人往往会忘记,在浮点类型中,我们有一个“正零”和一个“负零”值——打开和关闭符号位会留下相同的尾数和指数。阅读有关此 here 的更多信息。

好吧,事实证明这两个表达式在正号零上的表现不同,在负号零上的表现相同,如下所示:

<头>
x 的值 0-x 的值 -x 的值
-.0 0 0
0 0 -.0

See this on Coliru

所以,当 x 是浮点类型时,

  • 如果您想“忘记零的符号”,请使用 0-x
  • 如果您想“保留零的符号”,请使用 x

对于整数类型应该没有关系。


另一方面,正如@NateEldredge 指出的,由于整数提升,表达式在小整数类型上应该是等效的 - -x 转换为 x 的提升为 {{ 1}},然后应用减号。

答案 1 :(得分:3)

今天没有技术上的理由这样做。至少不是整数。至少不是一个理智的(根据某些任意定义)编码器会使用的方式。当然,它可能会导致演员阵容。我实际上不是 100% 确定,但在这种情况下,我会使用显式强制转换来清楚地传达意图。

正如 M.M 所指出的,在 K&R 时间是有原因的,当时 =- 等价于 -=。这导致 x=-y 等价于 x=x-y 而不是 x=0-y。这是不良影响,因此删除了该功能。

今天,原因是可读性。特别是如果您正在编写数学公式并想指出参数为零。一个例子是距离公式。 (x,y) 到原点的距离是 sqrt(pow(0-x, 2), pow(0-y, 2))