将负浮点值转换为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实数浮点和整数:
- 当实际浮点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)转换为未定义的行为。