c++ - 检查计算是否会导致溢出c++

标签 c++ integer-overflow

我在 collat​​z() 中添加了 elseif 语句来检查工作编号 * 3 + 1 是否会超过 INT_MAX,但在运行程序时,一些不应该超过 INT_MAX 的数字被报告为这样做。我可能不需要强制转换 INT_MAX,但我不确定。

#include <iostream>
#include <cstdlib>
#include <climits>

using namespace std;

void collatz( int startingnumber ) {

    int count = 0;

    int originalnumber = startingnumber;

    int workingnumber = startingnumber;

    while( workingnumber >= 1 ) {

        if( workingnumber == 1 ) {

            cout << originalnumber << " takes " << count << " steps" << endl;

            count = 0;

            break;
        }

        if( workingnumber % 2 == 0 ) {

            workingnumber /= 2;

            //optional
            //cout << originalnumber << " is at " << workingnumber << endl;

            count++;
        }
        else if( ( ( long int ) workingnumber * 3 ) + 1 > ( long int ) INT_MAX ) {

            cout << originalnumber << " will cause a buffer overflow" << endl;

            break;
        }        
        else {

            workingnumber = ( 3 * workingnumber ) + 1;

            //optional
            //cout << originalnumber << " is at " << workingnumber << endl;

            count++;
        }
    }
}

int main( int argc, char* argv[] ) {

    int increment = 2;

    if( argc > 1 ) {

        if( atoi( argv[1] ) != 0 ) {

            increment = atoi( argv[1] );
        }
    }

    while( increment <= INT_MAX ) {

        collatz( increment );

        increment++;
    }

    return 0;
}

最佳答案

当您需要对大数进行运算时,最好使用任意精度算术库,例如 GNU MPFR .

这样,您就不必担心整数溢出。

关于c++ - 检查计算是否会导致溢出c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265645/

相关文章:

c++ - Qt3d:应用 Qt3DRender::QLayerFilter 时显示的工件

c++ - Armadillo 对象上的 malloc

c++ - 将 double 转换为 int 时抛出浮点异常

c++ - 缓冲区如何知道在刷新操作期间要从外部文件传输多少个字符?

c++ - vector 对象声明后的括号是什么意思?

c++ - 如何检查 duration_cast 是否溢出

c++ - RSA 选择加密 key c++ 整数

c - 当两个 long long int 给出的结果大于 long long int 时,它们的总和?

c++ - 如果目标文件已经有头保护,我们应该用#ifndef 保护#include 吗?

c++ - 为什么 (18446744073709551615 == -1) 是真的?