当前位置:   article > 正文

c++ detect && solve integer overflow

c++ detect命名空间

以uint为例,当计算过程中(比如9999^6)产生大于UINT_MAX(2^32 - 1)的值的时候,编译时会产生integer overflow,即数值溢出,最后的结果也被截断.

1.如何检测 :https://www.quora.com/How-do-I-prevent-integer-overflow-in-C++(有墙)

贴上里面提供的示例代码:

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <climits>
  4. int main() {
  5. int x = 0x70000000;
  6. int y = 0x70000000;
  7. bool underflow = false;
  8. bool overflow = false;
  9. if ((x > 0) && (y > INT_MAX - x)) overflow = true;
  10. if ((x < 0) && (y < INT_MIN - x)) underflow = true;
  11. if(overflow) {
  12. std::cerr << "overflow will occur\n";
  13. exit(-1);
  14. }
  15. if(underflow) {
  16. std::cerr << "underflow will occur\n";
  17. exit(-1);
  18. }
  19. int z = x + y; // UH OH!
  20. std::cout << z << "\n";
  21. }

 2.如何解决:可以使用数组或者字符串模拟,例如使用std::string模拟乘法计算.只要内存够,多大的数都存的下(这里类似pure python的处理方式:使用pure python做运算,不会产生overflow,但是使用Numpy则会有overflow的问题,具体可参考:https://mortada.net/can-integer-operations-overflow-in-python.html)

  1. string bigmul(string a, string b) {
  2. int size = a.size() + b.size();
  3. char* res = new char[size];
  4. memset(res, a.size() + b.size(), 0);
  5. for (int i = b.size() - 1; i >= 0; i--) {
  6. for (int j = a.size() - 1; j >= 0; j--) {
  7. res[i+j+1] += (b[i] - '0')* (a[j] - '0');
  8. res[i+j] += res[i+j+1]/10;
  9. res[i+j+1] = res[i+j+1]%10;
  10. }
  11. }
  12. for (int i = 0; i < size; i++) {
  13. res[i] += '0';
  14. }
  15. return res[0] == '0' ? string(res+1) : string(res);
  16. }

  

转载于:https://www.cnblogs.com/deepllz/p/11511013.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/141907?site
推荐阅读
相关标签
  

闽ICP备14008679号