C++和GCC:GCC的C++实现如何处理除以零?

3

只是出于兴趣,GCC的C++实现如何处理其标准数字类型被零除的情况?我也很想听听其他编译器在零除方面的工作原理。请随意详细介绍。这不纯粹是为了娱乐,因为它与大学任务有些相关。

谢谢,查兹


谢谢,Preet。那真是显而易见的事情。我感到很惭愧错过了它。 - Charles Ritchie
1个回答

9
它并不会。通常情况下,当除法指令的操作数为0时,CPU会抛出某种内部异常,这将触发中断处理程序读取CPU上各种寄存器的状态并处理它,通常是通过将其转换为信号发送回程序,并由任何已注册的信号处理程序处理。在大多数类Unix操作系统的情况下,它们会收到一个SIGFPE。
虽然行为可能会有所不同(例如,在某些CPU上,您可以告诉CPU不要引发异常,但通常它们只会放置一些夹紧值,如0或MAXINT),但这种变化通常是由于OS、CPU和运行时环境的差异而不是编译器造成的。

SIGFPE是否会被转换为C++异常抛出?我知道这不是C++标准规定的,但我认为现实世界的编译器至少应该有一个选项来执行此操作。虽然在使用多个编译器的多年C++使用中,我从未考虑过这个问题。 - user180247
Steve:SIGFPE是一个运行时错误,可能会被SE处理器处理。提示:_set_se_translator。 - MP24
对于Unix系统,可以使用signal函数来注册一个信号处理程序(该程序可以转换为异常):http://www.cplusplus.com/reference/clibrary/csignal/signal/ - MP24
问题在于处理这些事情的不是C编译器,而是由系统库处理的运行时错误。有时候这些库会随编译器一起提供,但通常它们实际上是操作系统的一部分。无论如何,你通过库调用来控制程序的行为,而不是编译器选项。 - Louis Gerbarg

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