int main()
{
int x = 5, y = 0;
int z = x / y;
return 0;
}
我知道它具有不确定的行为,但这是否意味着分段错误?以及CPU如何处理除以0的情况?
运行此命令时,出现浮点异常(内核已转储)。
答案 0 :(得分:5)
通常,浮点异常是更通用的一类异常的示例。具体内容因机器而异。
有很多事情可以“杀死”您的程序,在这方面,所有这些都可以归类为例外:
在类似Unix的操作系统中,访问不存在的内存通常是“分段冲突”,而对内存的不正确访问通常是“总线错误”。 (在Windows下,它们是/是违反常规保护和/或BSOD的。)
正如您所看到的,尽管除以0是一个例外,但这是分段违规的同级,而不是子集。
(我将算术溢出列为例外,因为它可能是 ,而不是通常如此。当然,当今的大多数系统都不会将溢出视为例外。但是根据规则C,除了无符号整数上的溢出,C可以定义和良好地执行它们。)
在类似Unix的操作系统下,大多数/所有这些异常都倾向于映射到信号,您的程序可以捕获到这些信号,以便它可以(试图)继续而不是死掉。
>(具有讽刺意味的是,在我刚刚尝试过的系统上,整数除以0给我一个“浮点异常”,而一个浮点除以0给我一个IEEE-754 inf
,这完全不是例外,但这是different question。)
答案 1 :(得分:5)
如果行为未定义,则表示没有定义会发生什么。因此,提出“这是否意味着细分错误”这个问题意味着您错过了要点。任何事情都会发生。
此外,有许多CPU,并且您没有指定一个,因此回答“ CPU如何处理0除法”当然也是不可能的。
您可以捕获异常,并通过代码对其进行处理。