是否存在硬件将超出范围的浮点数转换为非零/非最值整数?
超出范围浮点数转整数的硬件行为疑问
在使用Berkeley TestFloat时,我注意到浮点数转整数的测试会检查特定结果值:
// file: test_a_f32_z_i32_rx.c // function: test_a_f32_z_i32_rx ... if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) { if ( verCases_checkInvInts || (trueFlags != softfloat_flag_invalid) || (subjFlags != softfloat_flag_invalid) || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1) && (! f32_isNaN( genCases_f32_a ) || (subjZ != 0))) ) { ++verCases_errorCount;
从中可见特定结果值为:0、0x7FFFFFFF(最大有符号整数)、-0x7FFFFFFF - 1(最小有符号整数)。
但根据C11及更高版本标准,超出范围的浮点数转整数属于未定义行为(UB)。由于通常(int)f会生成硬件指令(如x86_64平台的cvttss2si),特此问询:是否存在硬件会将超出范围的浮点数转换为非零、非最大/最小整数?
额外补充:为何“超范围整数转整数”是实现定义行为(IB),而“超范围浮点数转整数”是未定义行为(UB)?
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

