在另一次讨论中,用户在其 C 代码中遇到了“浮点错误”,尽管整数被零除是实际问题。这引发了关于整数除以零运算是否会引起浮点异常的争论。
传统上,整数除以零被视为生成整数异常(IA-32 上的 #DE 和AMD64),而浮点除零会触发浮点异常(中断 16 或 19)。然而,一些平台偏离了这个约定。
根据 POSIX 标准,整数操作数的除零运算必须生成 SIGFPE 信号,该信号指示浮点异常。这意味着在 POSIX 系统上,整数除以零将被报告为浮点异常。
对于许多使用 GNU C 库 (glibc) 的 Linux 系统, SIGFPE 通过 siginfo_t 对象的 si_code 字段提供附加信息。对于整数除以零,此字段的值为 FPE_INTDIV_TRAP。
关于 Windows 如何处理整数除以零异常的信息并不容易获得。 Windows 可能使用不同的异常类型或将不同的算术异常打包到类似于 Unix 的单个类别中。
与整数算术相反,IEEE754浮点标准定义了除零运算的特定行为:
在大多数操作系统和 C ABI 中,默认情况下会屏蔽用户空间进程的浮点异常。这允许通过计算传播错误值(NaN 和 Inf),而不会导致陷阱。
已提出“粘性”整数溢出标志的建议记录计算序列期间的溢出。然而,整数溢出检测方法因体系结构而异,x86 在每次计算后都需要条件分支,而 MIPS 提供了用于捕获有符号溢出的特定指令。
整数除法的行为 -零和浮点异常的处理因平台而异。虽然某些系统(例如 POSIX 系统)将整数除以零视为浮点异常,但其他系统可能会区分它们。在调试此类问题时,了解目标平台上的特定错误报告机制非常重要。
以上是整数除以零会触发浮点异常吗?的详细内容。更多信息请关注PHP中文网其他相关文章!