如何通过使用" limits "头使你的程序防御溢出的情况

How to make your program defensive against the situation of overflow by using “limits” header?

本文关键字:程序 溢出 情况 何通过 limits      更新时间:2023-10-16

这是我做的代码,请告诉我如何通过使用"limits"头来防止溢出的情况

#include<iostream>
using namespace std;
#define MAX 100
int main()
{
    cout<<"decimal to binary conversion"<<endl;
    bool binary[MAX];

    int decimal_num,i;
    cout<<"decimal number:"<<endl;
    cin>>decimal_num;
    for(i=0; (decimal_num/2)!=0; ++i)
    {
        binary[i]=decimal_num%2;
        decimal_num/=2;
    }
    binary[i]=decimal_num;
    cout<<endl;
    cout<<"Binary equivalent :"<<endl;
    for(i; i>=0;--i)
    {
        cout<<binary[i];
    }
    cout<<endl<<endl;
    return 0;
}

除了输入,似乎没有引起溢出的意义。

放弃使用cin直接读取整数,在逐位读取时检查输入。

定义这个函数

// read an non-negative integer from stdin
int read_num(void) {
    char input;
    int ret = -1;
    while (cin>>input) {
        if ('0' <= input && input <= '9') {
            int n = input - '0'; // the digit read
            if (ret < 0) ret = 0;
            // check if multiplying 10 will cause an overflow
            if (INT_MAX / 10 < ret) {
                cout << "overflow detected!" << endl;
                return -1;
            }
            ret *= 10;
            // check if adding n will cause an overflow
            if (INT_MAX - n < ret) {
                 cout << "overflow detected!" << endl;
                 return -1;
            }
            ret += n;
        } else break;
    }
    return ret;
}
在定义main()和更改 之前

cin>>decimal_num;

decimal_num = read_num();
if (decimal_num < 0) return 1;

请注意,bool类型不用于存储整数,我认为您应该使用int类型存储binary

你可以用这个来获取int型类型的大小:

static const unsigned MAX = 1 + std::numeric_limits<int>::digits;

我不太喜欢(+1)部分,所以这个定义应该更简洁:

static const unsigned MAX = sizeof(int) * std::numeric_limits<unsigned char>::digits;