use*_*108 35 c floating-point language-lawyer
如果将负浮点值转换为无符号整数类型的值,会发生什么?标准报价将不胜感激.我面临的问题是从变量类转换为无符号整数类型的值,它包含一个浮点类型的对象.
例:
unsigned i = -.1;
Run Code Online (Sandbox Code Playgroud)
Lun*_*din 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)包含完全相同的文本.
att*_*rri 28
如果浮点数小于或等于-1.0,则在C99中是未定义的行为.如果它在范围(-1.0,0.0)内,则结果值为0.
从C99,§6.3.1.4,第1段
当实数浮动类型的有限值被转换为除_Bool之外的整数类型时,小数部分被丢弃(即,该值被截断为零).如果整数部分的值不能用整数类型表示,则行为是未定义的
脚注50阐明了(-1.0,0.0)范围的行为.
您的示例unsigned i = -.1;是由C11和C99 明确定义的,结果是i == 0.
引用自N1570,6.3.1.4实数浮点数和整数:
- 当实数浮动类型的有限值被转换为除_Bool之外的整数类型时,小数部分被丢弃(即,该值被截断为零).如果整数部分的值不能用整数类型表示,则行为是未定义的.61)
61)当将实数浮动类型的值转换为无符号类型时,不需要执行当整数类型的值被转换为无符号类型时执行的剩余操作.因此,便携式实际浮动值的范围是(-1,Utype_MAX + 1).
引用自N869,6.3.1.4实数浮点数和整数:
#1
当实数浮动类型的有限值被转换为除_Bool之外的整数类型时,小数部分被丢弃(即,该值被截断为零).如果整数部分的值不能用整数类型表示,则行为是未定义的.43)
43)当将实数浮动类型的值转换为无符号类型时,不需要执行当整数类型的值被转换为无符号类型时执行的剩余操作.因此,便携式实际浮动值的范围是(-1,Utype_MAX + 1).
但是,正如您从引文中看到的那样,尝试转换范围外的浮点常量(-1,Utype_MAX + 1)会调用未定义的行为.