在 OS 中除以零

Divide by zero in OS

当您尝试将一个数除以零时,操作系统应该拉起一个中断(据我所知)。

我的问题与这个主题有关:当你试图用windows的计算器将一个数除以零时,是拦截异常的程序,还是打开一个异常的OS系统中断会丢弃由程序解决的异常?

TLDR 由于 Windows 是一个闭源操作系统,我个人无法验证 Windows 内核行为,但我有根据的猜测是该程序在让您的计算进入 CPU/ALU.

之前检查是否被零除

一般来说,你是对的,如果除以零一直到 CPU/ALU,那么应该生成 exception/interrupt。正如 here 中所解释的那样,在 Linux 中,该异常最终将向用户级进程发送终止信号 SIGFPE

您可以通过编译此程序在 Linux 中验证这一点:

void main(){
    int x = 1/0;
    return;
}

运行 gcc test.c 已经警告您除以零,但如果您愿意,让我们继续:

test.c: In function ‘main’:
test.c:2:14: warning: division by zero [-Wdiv-by-zero]
    2 |     int x = 1/0;
      |              ^

一旦你 运行 它,你会得到一个错误说 Floating point exception (core dumped) 这就是 SIGFPE 是什么。

现在让我们看看 Windows 计算器的行为。当您除以零时,它会显示错误 Cannot divide by zero。关键是,计算器程序没有崩溃,你可以继续计算。假设 Windows 函数类似于 Linux,计算器很可能会在 运行 对 CPU 进行计算之前进行“除以零”检查,从而使其能够捕获在 OS 参与之前发生错误。