c++ - 检查 C++ 中的 int 溢出

标签 c++ integer integer-overflow

我正在运行一个在 for 循环中添加数字的 C++ 程序:

int y = 0;
for (int i=0; i<NUM; i++) {
  int pow = 1;
  for (int j=0 j<i; j++) {
    pow *= 10;
  }
  y+= vec[i]*pow; // where vec is a vector of digits
}

但我不确定如何检查是否发生了溢出。有办法吗?

最佳答案

作为彼得正确 explained , 溢出是undefined behavior 标准 C++11(或 C99),你真的应该是 afraid of UB .

但是,一些编译器为您提供了处理和检测整数溢出的扩展。

如果您可以限制自己使用最近的 GCC编译器,你可以使用它的 integer overflow builtins .

您也可以限制自己使用 int32_t并在 int64_t 中计算算术并检查上面的结果 INT32_MAX或以下INT32_MIN .这可能比使用特定于编译器的扩展更慢(但更便携)。顺便说一句,一些编译器也有一些 __int128_t类型(因此您可以在 __int128_t 中计算算术并同样检查结果是否适合 int64_t )。

如果你的目标是拥有arbitrary precision arithmetic ,最好使用一些现有的 bignum 库,比如 GMPlib (因为高效 bignum 算术需要非常聪明的算法)。

关于c++ - 检查 C++ 中的 int 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185621/

相关文章:

c++ - 单文件 Makefile 问题 : C++

encoding - 这是什么类型的 int 存储?

java - 如何在 Java 中将整数的字符串表示形式转换为字符串?

c++ - 使用递归 C++ 将字符串转换为整数

c++ - 从常量表达式中有符号整数的溢出中删除未定义的行为?

c++ - 如何在 SendMessage 中使用 EM_SETSCROLLPOS 滚动到文本框的底部?

c++ - 在 C/C++ 中直接写入内存地址的最短代码是什么?

c++ - boost streambuf 并编写奇怪的行为

尝试分配 64 位整数时 Swift 3 uint64 溢出

assembly - 在MIPS中使用addi vs addiu的特定情况