C整数行为:除以零

时间:2016-06-04 12:20:57

标签: c division zero

我最近决定满足我的好奇心。 当你在C中除以零时会发生什么?我总是简单地用逻辑来避免这种情况,但很奇怪C这样的语言如何处理这种情况,它不能抛出可捕获的异常。

这是我非常简单的测试(在Windows 10上使用GCC编译):

int main()
{
    double test1 = 1.0/0.0;
    printf( "%f", test1 );
    int test2 = 1/0;
    printf( "%d", test2 );
}

使用double类型完成的操作给了我一个可爱的小迹象,表明结果不是数字:1.#INF00。到目前为止一切都很好..

然而,当使用int类型执行除以零时,程序(不是雄辩地)停止工作。"我在Windows上运行它,所以我收到了那个可爱对话的警告。

我对这种行为感到好奇。为什么崩溃程序选择整数除以零的解?是否真的没有其他解决方案,比如double方式,处理除零的解决方案?这在每个编译器上都是相同的行为,还是仅仅是GCC?

3 个答案:

答案 0 :(得分:3)

除以零会调用未定义的行为未定义的行为被调用时会发生任何事情。

引自N1570 6.5.5乘法运算符:

  

5 /运算符的结果是第一个操作数除以的商   第二; %运算符的结果是余数。在这两个操作中,如果值为   第二个操作数为零,行为未定义。

来自N1570的引用3.术语,定义和符号:

  

3.4.3

     

1个未定义的行为   在使用不可移植或错误的程序结构或错误数据时,   本国际标准没有要求

     

2   注意可能的未定义行为包括完全忽略不可预测的情况   结果,在翻译或程序执行过程中以文件化的方式表现   环境(有或没有发出诊断信息),终止翻译或   执行(发出诊断信息)。

答案 1 :(得分:2)

这是未定义的行为。

  

C11§6.5.5乘法运算符

     

/运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数。 在两个操作中,如果第二个操作数的值为零,则行为未定义。

答案 2 :(得分:1)

整数除以零的行为在c中是未定义的。所以输出可以依赖于任何东西,包括编译器。基本上这是因为没有特定的位模式来表示整数类型的无穷大。

定义浮点除以零:并且应该返回浮点的无穷大的最佳表示。