c - 何时解决 C 中的整数溢出问题

标签 c

相关问题:How to detect integer overflow?

在 C 代码中,每当添加整数时都应该解决整数溢出问题吗?似乎应该检查指针和数组索引。什么时候应该检查整数溢出?

当在C中没有明确指定类型的情况下添加数字,或者使用printf打印时,什么时候会发生溢出?

有没有办法自动检测整数算术溢出?

最佳答案

我听说过 C 语言中基于 setjmp() 或 longjmp() 的异常处理,但我认为没有本地方法可以做到这一点。我通常做的只是确保使用的类型足够长以包含我需要进行的所有加法/乘法。

与 C# 等托管语言(会抛出 OverflowException)相反,使用 C 的全部意义在于,不会在安全检查上浪费 CPU 能力。 C 会简单地转动计数器,从 FFFFFFFF 到 00000000,这样你就可以检查它(如果 a>b 等),但除此之外,我可以建议使用更长的类型。 64 位(long long)应该可以满足您的所有需求。

用printf打印数字时不会发生溢出,或者至少我没有听说过这种可能性。对于附加内容,我只需使用足够的类型并告诉编译器如何解释这些值,以便避免不必要的转换(例如,文字“123”将被解释为 32 位,但“123LL”将被解释为 64 位 -与“.1f”与“.1”相同)。

对于数组索引 - 您应该始终确保不会读取/写入数组,因为在许多情况下,C 会很乐意破坏您的数据而不会导致错误。

至于何时应检查整数溢出...好吧,只要它可能发生并且您不希望它发生:)。

关于c - 何时解决 C 中的整数溢出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2709420/

相关文章:

c - getchar() 在 C 中不起作用

c - 指向函数中结构数组的指针

使用 zmq API 编译 C 代码

c - 将数组中的所有值设置为零时出错

c - 除了与函数指针一起使用之外,是否还有在 C 中对函数进行类型定义的目的?

c - 如何在 C 中使用 SMTP 验证?

c++ - Windows (Visual C) 是否有 unistd.h 的替代品?

c - 基于汇编32位(x86)编写C代码

c - 如何在C中使用自引用结构?

c - 通过 SWIG 输入 Python 3 个字节到 C char*