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

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)包含完全相同的文本.

  • 正如Antti所指出的那样`(无符号) - .1`在范围内(-1,Utype_MAX + 1),所以这种特殊情况不是未定义的行为.我们可以迂腐地重写答案,***在负值高于-1.0**的情况下,它会调用未定义的行为*. (9认同)
  • @Lundin,但明确的问题是-.1,截断是可以表示的. (7认同)
  • @TobySpeight也许你的意思是"负值**的执行低于/小于**-1.0" (3认同)
  • 这是C标准吗?其实我注意到这个问题是多标记的.有一个upvote. (2认同)

att*_*rri 28

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

从C99,§6.3.1.4,第1段

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

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


nal*_*zok 5

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

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

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

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

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

#1

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

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

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