将负浮点值转换为unsigned int的行为是什么?

时间:2016-04-06 06:50:45

标签: c floating-point language-lawyer

如果将负浮点值转换为无符号整数类型的值,会发生什么?标准报价将不胜感激。我面临的问题是从变量类转换为无符号整数类型的值,它包含一个浮点类型的对象。

实施例

unsigned i = -.1;

3 个答案:

答案 0 :(得分:40)

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

  

6.3.1.4

     

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

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

  

61)当整数类型的值执行剩余操作   转换为无符号类型时不需要执行值   实际浮动类型转换为无符号类型。因此,范围   便携式实数浮点值为(-1,Utype_MAX + 1)。

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

答案 1 :(得分:28)

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

来自C99,§6.3.1.4,第1段

  

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

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

答案 2 :(得分:5)

你的例子,unsigned i = -.1;被C11和C99 明确定义,结果是i == 0

引自N1570,6.3.1.4 Real floating和integer:

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

    61)当值为整数时执行剩余操作   类型转换为无符号类型时不需要执行值   实际浮动类型转换为无符号类型。因此,范围   便携式实际浮动值的值是(-1,Utype_MAX + 1)。

引自N869,6.3.1.4 Real floating和integer:

  

#1

     

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

     

43)当值为整数时执行剩余操作   类型转换为无符号类型时不需要执行值   实际浮动类型转换为无符号类型。因此,范围   便携式实际浮动值的值是(-1,Utype_MAX + 1)。

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