将无限值分配给整数类型是否具有未定义的行为?

问题描述 投票:0回答:1

C 标准指定了有限浮点值在存储为整数类型时如何转换,但似乎没有指定非有限值的行为:

6.3.1.4 实数浮点数和整数

1    当标准浮点类型的有限值转换为

bool
以外的整数类型时,小数部分将被丢弃(即,该值被截断为零)。如果整数部分的值不能用整数类型表示,则行为未定义。

2    当小数浮点数类型的有限值转换为

bool
以外的整数类型时,小数部分将被丢弃(即,该值被截断为零)。如果整数部分的值不能用整数类型表示,则应引发“无效”浮点异常,并且转换结果未指定。

3    当整数类型的值转换为标准浮点类型时,如果转换后的值可以在新类型中精确表示,则该值不变。如果要转换的值在可以表示但无法精确表示的值范围内,则结果是最接近的较高或最接近的较低可表示值,以实现定义的方式选择。如果正在转换的值超出了可以表示的值范围,则行为未定义。某些隐式转换的结果可能会以比新类型所需的范围和精度更大的范围和精度表示(请参阅 6.3.1.8 和 6.8.6.4)。

4    当整数类型的值转换为十进制浮点数类型时,如果转换后的值可以在新类型中精确表示,则该值不变。如果无法准确表示正在转换的值,则应正确舍入结果,并按照 IEC 60559 中的规定引发异常。

C 标准中的其他地方是否指定或未定义该行为?

c floating-point type-conversion language-lawyer undefined-behavior
1个回答
0
投票

将浮点类型的无限值转换为整数类型是未定义的 C,不是因为标准,而是因为它没有说

C 标准中其他地方是否未定义该行为?

标准不需要显式地将行为声明为“未定义”,因为它是未定义的。简单地不定义它就足够了。这正是“未定义行为”的定义。引用N3096/3.4.3

3.4.3

未定义的行为
使用不可移植或错误的程序构造或错误数据时的行为,本文档对此没有强加任何要求

该标准仅对浮点类型的
有限

值转换为整数类型提出要求。标准未涵盖的每种情况本身就是未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.