int main()
{
int x = 5, y = 0;
int z = x / y;
return 0;
}
我知道它属于未定义的行为,但这是否意味着分段错误?CPU 如何处理除以 0 的情况?
当我运行它时,我得到浮点异常(核心转储(。
如果行为未定义,则表示没有定义所发生的情况。因此,提出"这是否意味着分割错误"的问题意味着您错过了重点。任何事情都可能发生。
此外,有很多 CPU,而您没有指定一个,因此回答"CPU 如何处理除以 0"当然也是不可能的。
您可以捕获异常,并在代码中处理它们。
通常,浮点异常是更通用的异常类的示例。 具体细节因机器而异。
有许多事情可以"杀死"你的程序,所有这些都可以归类为这方面的例外:
- 访问不存在的内存
- 内存访问不当(未对齐、写入只读等(
- 除以 0
- 非法指令
- 超出资源限制(例如 CPU 时间(
- 算术溢出
在类Unix操作系统下,访问不存在的内存通常是"分段违规",而对内存的不当访问通常是"总线错误"。 (在Windows下,它们是一般保护违规和/或蓝屏。
如您所见,尽管除以 0 是一个例外,但它是分段冲突的同级,而不是子集。
(我将算术溢出列为例外,因为它可能是,而不是因为它通常是。 当然,今天的大多数系统都不会将溢出视为例外。 但是根据 C 的规则,他们可以,除了无符号整数上的溢出,这是 C 定义和行为良好的要求。
在类Unix操作系统下,大多数/所有这些异常都倾向于映射到信号,你的程序可以捕获这些信号,以便它可以(尝试(继续而不是死亡。
(具有讽刺意味的是,在我刚刚尝试过的系统上,整数除以 0 给了我一个"浮点异常",而浮点除以 0 给了我一个 IEEE-754inf
,这根本不是例外。 但这是一个不同的问题。