关于在C中除以零的一些事情

可能重复:
值返回1.#INF000

我一直认为除以0会导致编译程序崩溃

但是我今天发现(使用VC ++ 2010 Express),除以0得到的东西叫做1.#INF000,它应该是正无穷大

当它传递给函数时,它被传递为-1。#IND000

这是怎么回事?

在Google上搜索1.#INF000和-1。#IND000也没有提供任何明确的解释

它只是VC ++特有的东西吗?

浮点除以零的行为与整数除以零的行为不同。

IEEE浮点标准区分+ inf和-inf,而整数不能存储无穷大。 整数除零会导致未定义的行为。 浮点除以零由浮点标准定义,结果为+ inf或-inf。

编辑:

正如Luchian所指出的,C ++实现不需要遵循IEEE浮点标准。 如果您使用的实现不遵循IEEE浮点标准,则浮点除以零的结果是未定义的。

编辑:问题是关于C ++,并且C ++中的结果是未定义的,正如标准明确说明的那样 ,而不是IEEE或其他实际上没有规范C ++语言的实体。 标准呢。 C ++实现可能遵循IEEE规则,但在这种情况下,很明显行为是未定义的。

我一直认为除以0会导致编译程序崩溃

不,它导致未定义的行为。 任何事情都可能发生,不能保证崩溃。

根据C ++标准:

5.6乘法运算符

4)二元/运算符产生商,二元%运算符从第一个表达式除以第二个表达式得到余数。 如果/或%的第二个操作数为零,则行为未定义 ; 否则(a / b)* b + a%b等于a。 如果两个操作数都是非负的,那么余数是非负的; 如果没有,余数的符号是​​实现定义的79)。 (强调我的)

引用ISO C ++标准的最新草案 ,第5.6节([expr.mul]):

如果/或%的第二个操作数为零,则行为未定义。

这适用于整数和浮点除法。

特定的C ++实现可以符合IEEE浮点标准 ,该标准具有对除零的更具体要求,在这种情况下,可以为该实现很好地定义行为。 这可能就是为什么浮点除零会在实现中产生无穷大的原因。 但是C ++标准不需要IEEE浮点行为。

您可以在C中使用以下代码片段,它会抛出exception。 它适用于linux donno关于Windows

 #include  #include  static void __attribute__ ((constructor)) trapfpe(void) { /* Enable some exceptions. At startup all exceptions are masked. */ feenableexcept(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW); }