除以零异常是如何工作的?

4

编译器/芯片级别如何计算除法?

为什么C++总是在运行时抛出这些异常,而不是在编译时(如果在编译时已知除数为零)?


1
这应该是两个不同的问题。 - jason
为什么程序员在除法运算前不检查是否为零? - Thomas Matthews
Thomas:因为传入零的概率非常低,异常处理机制很好用,而且额外的检查会增加处理器的工作量,在高频循环中可能不是我们想要的。 - Stijn Sanders
g++至少在编译时警告,如果它看到您明显地除以零:temp.cpp:5:警告:在'1/0'中除以零。 - Jeremy Friesner
4个回答

2
这完全取决于编译器。如果您愿意,可以为您的编译器编写一个扩展程序来检查这种问题。
例如Visual C ++:

2
  1. 这取决于处理器。有些处理器有硬件除法指令,而有些处理器需要在软件中进行计算。
  2. 一些C++编译器也不会在运行时触发异常,通常是因为没有硬件支持来捕获除以零的情况。

1
  1. 在芯片层面上,除法当然是通过电路完成的。这里提供了二进制除法电路的概述。
  2. 因为C++编译器没有检查被除数是否保证等于0。它本可以检查。

0
  1. 大型查找表。还记得学校里的乘法表吗?这个想法是一样的,只不过是除法而不是乘法。显然,并不是每个数字都在里面,但数字被分成块,然后通过表格传递。

  2. 除法是在运行时进行的,而不是在编译时进行的。是的,编译器可以看到除数为零,但大多数人不会写出无效的语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接