【问题标题】:Is the behavior of unsigned(-0.0) defined in C++?unsigned(-0.0) 的行为是否在 C++ 中定义?
【发布时间】:2013-06-21 00:01:13
【问题描述】:

C++11 4.9 浮点-积分转换[conv.fpint]:

浮点类型的纯右值可以转换为整数类型的纯右值。转换截断;也就是说,小数部分被丢弃。如果截断的值无法在目标类型中表示,则行为未定义。

如果值为-0.0,是否定义了行为?归结为“截断的值是否不能在目标类型中表示”。可以表示零。可以负零吗?在这种情况下,这两个零值是区分还是不区分?

【问题讨论】:

  • 负零与正零相同,比较方式。两者的值都为零...
  • 当然。但这并不能说明截断的值(如果该值为 -0.0)是否可以用 unsigned 类型表示。
  • 这有两个部分:一个是“截断部分”。二是用整数类型表示。你同意 -0.0 的截断部分是 0 吗?
  • 我认为至少还不清楚,因此是这个问题。如果此处截断的值确实是 +0,那么肯定会定义行为。
  • 不要混淆类型和值。在抽象意义上,“截断值”只是一个数字。它实际上只能是零。

标签: c++ floating-point type-conversion language-lawyer


【解决方案1】:

-0.0的截断值是0,可以用整型表示(包括无符号整型)。没有理由认为-0.00.0 的截断值不同,正如-0.250.3 的截断值不同一样。

【讨论】:

  • "没有理由假设...-0.250.3 的截断值不同" 嗯,这很公平。不过,我不确定在这两种情况下是否很明显,删除小数部分并获得零值会选择带正符号的零。但这当然是所有语言律师的领域,主要是为了好玩。 :-)
  • @JeffWalden:没有正符号零。在这种情况下,值是数学值。
  • 一些规范清楚地表明运算是基于数学值的。 ECMAScript (JavaScript) 就是其中之一(并明确阐明了如何考虑零和符号)。我在 C++ 中搜索了可以做出类似陈述但找不到任何语言,所以我不确定你的断言是否完全合理。
  • 至少,无符号整数被记录为服从模算术,这意味着任何非无穷大、非 NaN 值都应该可以用无符号整数类型(模 2**bitcount)表示。任何零(正数、负数或无符号数)的模表示将为 0
猜你喜欢
  • 2018-06-28
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多