【问题标题】:What is the behaviour on converting a negative floating point value into an unsigned int? [duplicate]将负浮点值转换为无符号整数的行为是什么? [复制]
【发布时间】:2016-04-06 06:50:44
【问题描述】:

如果将负浮点值转换为无符号整数类型的值会怎样?标准报价将不胜感激。我面临的问题是从包含浮点类型对象的变体类转换为无符号整数类型的值。

示例:

unsigned i = -.1;

【问题讨论】:

  • 请定义converted
  • 尝试过了吗?你有什么问题?
  • @jtbandes:这是一个很深的问题。充其量,它将是定义的实现。
  • @SouravGhosh 我会假设转换的 C 标准定义,如第 6.3 章所述。
  • @jtbandes 尝试是最糟糕的方法。

标签: c floating-point language-lawyer


【解决方案1】:

如果负值是 -1.0 或更低,它会调用未定义的行为,因为整数部分不能用无符号数表示。否则,(如 -0.1 的情况),如果它可以用整数类型表示,则它是明确定义的行为。请参阅 C11 标准、ISO 9899:2011:

6.3.1.4

当实浮点类型的有限值转换为整数时 _Bool 以外的类型,小数部分被丢弃(即, 值被截断为零)。如果积分部分的值 不能用整数类型表示,行为未定义。 61)

然后有一个非规范的脚注解释了上面的文字:

61) 整数类型的值时执行的求余运算 值转换为无符号类型时不需要执行 真正的浮点类型转换为无符号类型。因此,范围 可移植的实浮点值是 (−1, Utype_MAX+1)。

ISO/IEC 9899:1999 (C99) 包含完全相同的文本。

【讨论】:

  • 那是 C 标准吗?实际上我注意到这个问题是多标签的。投赞成票。
  • @Bathsheba 这个问题同时被标记为 C 和 C++,因此任何一个标准都是相关的。但这是个好问题。
  • @Lundin 但这个问题明确地是-.1,截断后可以表示。
  • 正如 Antti 指出的 (unsigned)-.1 在范围内 (−1, Utype_MAX+1),所以这种特殊情况不是未定义的行为。我们可以迂腐地重写答案,如果执行高于 -1.0 的负值,它会调用未定义的行为。
  • @TobySpeight 也许你的意思是“负值的执行低于/小于 -1.0”
【解决方案2】:

如果浮点数小于或等于 -1.0,则在 C99 中这是未定义的行为。如果在 (-1.0, 0.0) 范围内,则结果值为 0。

来自 C99,§6.3.1.4,第 1 段

当将实数浮点类型的有限值转换为 _Bool 以外的整数类型时,小数部分被丢弃(即,该值被截断为 0)。如果整数部分的值不能用整数类型表示,则行为未定义

脚注 50 阐明了 (-1.0, 0.0) 范围的行为。

【讨论】:

    【解决方案3】:

    您的示例 unsigned i = -.1; 是由 C11 和 C99良好定义,结果是 i == 0

    引自N1570,6.3.1.4 实浮点数和整数:

    1. 当实浮点类型的有限值转换为 _Bool 以外的整数类型时,小数部分将被丢弃(即, 该值被截断为零)。如果积分部分的值 不能用整数类型表示,行为是 undefined.61)

    61) 当一个整数值时执行的求余运算 类型转换为无符号类型时不需要执行值 真正的浮点类型转换为无符号类型。因此,范围 可移植实浮点数为 (-1, Utype_MAX+1)。

    引自N869,6.3.1.4 实浮点数和整数:

    #1

    当实浮点类型的有限值转换为整数时 _Bool 以外的类型,小数部分被丢弃(即, 值被截断为零)。如果积分部分的值 不能用整数类型表示,行为是 未定义.43)

    43)当一个整数值时执行的求余运算 类型转换为无符号类型时不需要执行值 真正的浮点类型转换为无符号类型。因此,范围 可移植实浮点数为 (-1, Utype_MAX+1)。

    但是,正如您从引用中看到的那样,尝试转换范围之外的浮点常量 (-1, Utype_MAX+1) 会调用未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-17
      • 2013-11-01
      • 2011-01-30
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2013-11-26
      相关资源
      最近更新 更多