将float + INF,-INF和NAN转换为C中的整数的结果是什么?

时间:2010-10-21 11:12:56

标签: c math standards

是否有任何标准规定输出应该是什么?

例如这段代码:

#include <stdio.h>
#include <math.h>

int main(int argc, char** argv) {
  float a = INFINITY;
  float b = -INFINITY;
  float c = NAN;

  printf("float %f %f %f\n", a, b, c); 
  printf("int %d %d %d\n", (int) a, (int) b, (int) c); 
  printf("uint %u %u %u\n", (unsigned int) a, (unsigned int) b, (unsigned int) c); 
  printf("lint %ld %ld %ld\n", (long int) a, (long int) b, (long int) b); 
  printf("luint %lu %lu %lu\n", (unsigned long int) a, (unsigned long int) b, (unsigned long int) c); 

  return 0;
}

在gcc 4.2.1版(Apple Inc. build 5664)上编译目标:i686-apple-darwin10

输出:

$ gcc test.c && ./a.out 
float inf -inf nan
int -2147483648 -2147483648 -2147483648
uint 0 0 0
lint -9223372036854775808 -9223372036854775808 -9223372036854775808
luint 0 9223372036854775808 9223372036854775808

这很奇怪。 (int)+ inf&lt; 0!?!

1 个答案:

答案 0 :(得分:15)

保罗说,这是未定义的:

来自§6.3.1.4:

  

6.3.1.4 Real floating和integer

     

当真实浮动类型的有限值是   转换为其他整数类型   比_Bool,小数部分是   丢弃(即值为   截断为零)。如果值   不可能是整体部分   由整数类型表示,   行为未定.50)

无穷大不是有限的,并且整数部分不能用整数类型表示,所以它是未定义的。