【问题标题】:When is it useful to write "0 - x" rather than "-x"?什么时候写“0 - x”而不是“-x”有用?
【发布时间】:2021-10-07 09:09:47
【问题描述】:

我偶尔注意到一些 C 代码坚持使用0 - x 来获得x 的加法补码,而不是写-x。现在,我想这些对于尺寸小于int 的类型是不等价的(edit:不,即使那样显然也是等价的),但除此之外 - 前者而不是后者有什么好处?

【问题讨论】:

  • 实际上,无论哪种情况,都会被提升为int。我看到它们产生不同效果的唯一情况是x 是浮点数。
  • 这些天我只是猜测可读性。在 K&R 时代,他们可能希望避免使用 y=-x,其中 =--= 的替代标记
  • 不出所料,浮点零存在差异:coliru.stacked-crooked.com/a/bc2ec461b152cefc
  • 看看这个偶尔来自哪里会很有趣。
  • 根据工具链,unsigned int x; x = -x; 可能会导致警告,而unsigned int x; x = 0 - x; 不会。对于浮点类型,一元减号通常映射到 IEEE-754 “取反”操作,这是一种位级操作,而不是算术操作。所以-x 对于零和 NaN 操作数的行为与 0 - x 不同。

标签: c subtraction idioms negative-number


【解决方案1】:

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

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

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

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

value of x value of 0-x value of -x
-.0 0 0
0 0 -.0

See this on Coliru.

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

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

对于整数类型,这无关紧要。


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

【讨论】:

    【解决方案2】:

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

    正如 M.M 指出的那样,在 K&R 时代是有原因的,当时=- 等同于-=。这具有x=-y 等效于x=x-y 而不是x=0-y 的效果。这是不良影响,因此该功能已被删除。

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

    【讨论】:

    • 这是对-= 运算符(和其他运算相等运算符)的原始形式的一个很好的观察。这可能很好地解释了 OP 所询问的成语的来源。
    猜你喜欢
    • 2014-10-26
    • 2016-06-11
    • 2021-01-19
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2018-01-04
    • 2010-09-11
    • 2020-09-24
    相关资源
    最近更新 更多