gpt4 book ai didi

c - C语言中如何捕获整数被零除异常?

转载 作者:太空狗 更新时间:2023-10-29 15:11:24 25 4
gpt4 key购买 nike

已知如何使用

捕获 float 被零除异常
signal(SIGFPE, handler)

但即使我设置了控制字,它也不会捕获整数被零除的问题

_control87(0, _MCW_EM ); (MS VC 2010)

子问题_1:如何在不使用 SEH EXCEPTION_INT_DIVIDE_BY_ZERO 的情况下捕获 Windows 中 C 程序中的整数被零除? (在 Unix/Linux 中,这可以通过使用标准信号/SIGFPE 技术来完成)

编辑:signal 是 ANSI C 信号处理方法。
_control87 是设置浮点控制字的标准 Windows 函数。

类似问题:How to handle all errors, including internal C library errors, uniformly

注意(来自 ISO/IEC 9899:TC2 附件 H.2.2):

》有符号的C整数类型int、long int、long long int,以及对应的无符号类型与 LIA-1 兼容。 ... C 的无符号整数类型在 LIA-1 意义上是“模数”,因为溢出或越界结果会自动换行。将有符号整数类型定义为模数的实现不需要检测整数溢出,在这种情况下,仅需要检测被零除的整数。

?最终解决方案:

对于 Windows:它抛出 SEH 异常。所以它可以通过使用 __try __except 来捕获。 作为可能的解决方案,SEH 翻译可用于处理 SEH 异常并将它们翻译为所需函数的调用。这不是一种“自然”的方式,但似乎是唯一的方式。

对于 Unix:它可以用 signal/SIGFPE 解决方案捕获。或者查看 wiki 以获取 FPE_INTDIV 解决方案 ( http://rosettacode.org/wiki/Detect_division_by_zero#C )。

由于 GMan 关于“未定义行为”的说法是正确的,因此我选择他的答案是正确的。

注意:检查 VC\crt\src\winxfltr.c: _XcptActTab 数组很有趣:)

最佳答案

被零除会导致未定义的行为,没有可以对此做任何事情的 C 语言结构。最好的办法是首先检查分母,不要除以零。

如果你想“捕获”(注意,C 没有异常(exception))这个错误,它将取决于你没有列出的编译器和操作系统。顺便说一句,_control87只与浮点运算有关,与整数运算无关。

关于c - C语言中如何捕获整数被零除异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3105591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com