如果将负浮点值转换为无符号整数类型的值,会发生什么?标准报价将不胜感激。我面临的问题是从变量类转换为无符号整数类型的值,它包含一个浮点类型的对象。
实施例
unsigned i = -.1;
答案 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:
- 当实数浮动类型的有限值转换为_Bool以外的整数类型时,小数部分被丢弃(即, 该值被截断为零)。如果是积分部分的值 不能用整数类型表示,行为是 undefined.61)
醇>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)会调用未定义的行为。