将NAN浮动到int的问题

Chr*_*ris 12 c floating-point nan

忽略我为什么要这样做,754 IEEE fp标准没有定义以下行为:

float h = NAN;
printf("%x %d\n", (int)h, (int)h);

Gives: 80000000 -2147483648
Run Code Online (Sandbox Code Playgroud)

基本上,无论我给出的NAN值是多少,它都输出80000000(十六进制)或-2147483648(十进制).是否有这样的原因和/或这是正确的行为?如果是这样,怎么样?

我给它不同的NaN值的方法是: 如何手动设置等于NaN的浮点的位值?

所以基本上,是否存在NaN的有效载荷影响演员输出的情况?

谢谢!

Dan*_*her 11

浮点数的铸造成一个整数的结果未在整数变量(±1为截断)的范围未定义的值.

A NaN超出范围,因此结果未定义.

实际上,该标准仅提到将浮点类型的有限值转换为整数类型.

  • 哦,嗯,​​脸红*,我确定.但当然,非x86硬件是苹果公司发明的销售更多Mac的神话.(感谢您的更正,@ R ..) (2认同)

Eri*_*hil 9

这种行为是有原因的,但这并不是你应该依赖的东西.

正如您所注意到的,IEEE-754没有指定将浮点NaN转换为整数时会发生什么,除了它应该引发无效的操作异常,编译器可能会忽略该异常.C标准说行为是未定义的,这意味着你不仅不知道你将得到什么整数结果,你不知道你的程序将做什么; 该标准允许程序中止或获得疯狂的结果或做任何事情.您可能在英特尔处理器上执行了此程序,并且您的编译器可能使用其中一个内置指令进行了转换.英特尔非常谨慎地指定指令行为,并且将浮点NaN转换为32位整数的行为是返回0x80000000,而不管NaN的有效负载,这是您观察到的.

因为Intel指定了指令行为,所以如果您知道所使用的指令,则可以依赖它.但是,由于编译器不向您提供此类保证,因此您不能依赖于使用此指令.

  • 英特尔处理器可能会将 NAN 转换为 32 位 int 为“0x80000000”,但如果您的 NAN 是由编译器确定的常量值,则这对您无济于事。在这种情况下,您可能会看到 INT_MIN 以外的值,因为转换是在编译时而不是运行时完成的,因此英特尔的 x86 语义永远不会发挥作用。例如,当 GCC 在编译时将 NAN 转换为 int 时,它给出 0。 (2认同)