【问题标题】:What is the result of casting float +INF, -INF, and NAN to integer in C?在 C 中将 float +INF、-INF 和 NAN 转换为整数的结果是什么?
【发布时间】:2010-10-21 11:12:55
【问题描述】:

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

例如这段代码:

#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

【问题讨论】:

  • 这是未定义的行为 - 还有什么可能
  • 在 Java 中,无穷大被强制转换为最接近的值(MAX_VALUE 或 MIN_VALUE),而 NaN 被强制转换为 0。

标签: c math standards


【解决方案1】:

正如保罗所说,它是未定义的:

从 §6.3.1.4:

6.3.1.4 实数浮点数和整数

当实浮点类型的有限值是 转换为整数类型 other 比_Bool,小数部分是 丢弃(即,值为 向零截断)。如果值 不可分割的部分 由整数类型表示,则 行为未定义。50)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2010-10-13
    • 2021-12-14
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多