C中的任何数字除以0,是否属于分段错误?
我知道它属于未定义的行为,但它是否意味着分割错误?CPU如何处理除以0的情况C中的任何数字除以0,是否属于分段错误?,c,segmentation-fault,undefined-behavior,divide-by-zero,C,Segmentation Fault,Undefined Behavior,Divide By Zero,我知道它属于未定义的行为,但它是否意味着分割错误?CPU如何处理除以0的情况 当我运行这个程序时,我会得到浮点异常(内核转储)。一般来说,浮点异常是更一般的异常类的一个例子。具体细节因机器而异 有许多事情会“杀死”您的程序,在这方面,所有这些都可以归类为例外: 访问不存在的内存 对内存的访问不正确(未对齐、写入只读等) 除以0 非法指令 超出资源限制(例如CPU时间) 算术溢出 在类Unix操作系统下,对不存在的内存的访问通常是“分段冲突”,而对内存的不当访问通常是“总线错误”。(在Wind
当我运行这个程序时,我会得到浮点异常(内核转储)。一般来说,浮点异常是更一般的异常类的一个例子。具体细节因机器而异 有许多事情会“杀死”您的程序,在这方面,所有这些都可以归类为例外:
- 访问不存在的内存
- 对内存的访问不正确(未对齐、写入只读等)
- 除以0
- 非法指令
- 超出资源限制(例如CPU时间)
- 算术溢出
(具有讽刺意味的是,在我刚刚尝试过的系统上,整数除以0会给我一个“浮点异常”,而浮点除以0会给我一个IEEE-754
inf
,这根本不是异常。但这是一个。)如果行为没有定义,就意味着对发生的事情没有定义。因此,提出“这是否意味着分割错误”的问题意味着你没有抓住重点。任何事情都有可能发生
另外,有许多CPU,并且您没有指定一个,所以回答“CPU如何处理除以0”当然也是不可能的
您可以捕获异常,并在代码中处理它们。浮点异常不是分段错误。如果您要询问对特定系统的影响,请回答您的问题并告诉我们是哪个系统。CPU通过抛出硬件异常来处理它。就是这样,它与C语言或操作系统无关。毫无意义的UB问题,请看未定义的含义。具体发生的情况取决于您的机器和环境。顺便说一句,如果使用IEEE-754格式,浮点类型上可以很好地定义0除。它是UB:“/运算符的结果是第一个操作数除以第二个操作数的商;%运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。”@用户694733谢谢。(你帮我省了一次下楼去拿标准副本的行程。)删除了句子。仅供参考,我还注意到这个答案实际上更像是一个评论,而且有点刺耳。你能改写吗?
int main()
{
int x = 5, y = 0;
int z = x / y;
return 0;
}