C中的任何数字除以0,是否会出现分段错误?

时间:2018-07-04 10:19:31

标签: c segmentation-fault undefined-behavior divide-by-zero

int main()
{
    int x = 5, y = 0;
    int z = x / y;
    return 0;
}

我知道它具有不确定的行为,但这是否意味着分段错误?以及CPU如何处理除以0的情况?

运行此命令时,出现浮点异常(内核已转储)。

2 个答案:

答案 0 :(得分:5)

通常,浮点异常是更通用的一类异常的示例。具体内容因机器而异。

有很多事情可以“杀死”您的程序,在这方面,所有这些都可以归类为例外:

  • 访问不存在的内存
  • 对内存的访问不正确(未对齐,以只读方式写入等)
  • 除以0
  • 非法指示
  • 超出资源限制(例如CPU时间)
  • 算术溢出

在类似Unix的操作系统中,访问不存在的内存通常是“分段冲突”,而对内存的不正确访问通常是“总线错误”。 (在Windows下,它们是/是违反常规保护和/或BSOD的。)

正如您所看到的,尽管除以0是一个例外,但这是分段违规的同级,而不是子集。

(我将算术溢出列为例外,因为它可能是 ,而不是通常如此。当然,当今的大多数系统都不会将溢出视为例外。但是根据规则C,除了无符号整数上的溢出,C可以定义和良好地执行它们。)

在类似Unix的操作系统下,大多数/所有这些异常都倾向于映射到信号,您的程序可以捕获到这些信号,以便它可以(试图)继续而不是死掉。

>

(具有讽刺意味的是,在我刚刚尝试过的系统上,整数除以0给我一个“浮点异常”,而一个浮点除以0给我一个IEEE-754 inf,这完全不是例外,但这是different question。)

答案 1 :(得分:5)

如果行为未定义,则表示没有定义会发生什么。因此,提出“这是否意味着细分错误”这个问题意味着您错过了要点。任何事情都会发生。

此外,有许多CPU,并且您没有指定一个,因此回答“ CPU如何处理0除法”当然也是不可能的。

您可以捕获异常,并通过代码对其进行处理。