在C语言中,将浮点数+INF、-INF和NAN强制转换为整数的结果是什么?

14

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

例如这段代码:

#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.构建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 < 0 !?!


4
这是未定义行为,还能是什么呢? - Paul R
1
在Java中,无穷大被转换为最接近的值(MAX_VALUE或MIN_VALUE),而NaN被转换为0。 - starblue
1个回答

17

正如Paul所说,这是未定义的:

根据 §6.3.1.4:

6.3.1.4 实浮点数和整数

当将有限的实浮点类型转换为除 _Bool 以外的整数类型时,小数部分会被舍弃(即,值向零取整)。如果整数部分的值无法用整数类型表示,则其行为是未定义的。50)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接