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

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

例:

unsigned i = -.1; 

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

6.3.1.4

当实际浮点types的有限值被转换为除_Bool以外的整数types时,小数部分被丢弃(即,值被截断为零)。 如果整数部分的值不能用整数types表示,则行为是不确定的。 61)

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

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

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

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

从C99,第6.3.1.4段第1段

当实际浮点types的有限值被转换为除_Bool以外的整数types时,小数部分被丢弃(即,值被截断为零)。 如果整数部分的值不能用整数types表示,则行为是不确定的

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

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

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

  1. 当实际浮点types的有限值被转换为除_Bool以外的整数types时,小数部分被丢弃(即,值被截断为零)。 如果整数部分的值不能用整数types表示,则行为是不确定的.61)

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

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

#1

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

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

但是,从引号中可以看出,尝试将范围外的浮点常量(-1,Utype_MAX + 1)转换为未定义的行为。