尝试读取大于 INT_MAX 的 int 时出现无限循环

Infinite loop when trying to read an int greater than INT_MAX

我正在编写一些 C++ 代码,以找出整数的内部表示。但是我偶然发现了一个奇怪的错误,我似乎无法推断出这个问题的原因。

代码很简单。它要求用户输入(I、LI 或 SI)。

LI和SI分别给出了最大和最小整数的表示。 'I' 需要一个整数输入,用户想知道它的表示形式。

一切正常,直到我给出输入,

本人2147483648

现在这比 C++ 中的最大整数 (2147483647) 大 1。

我预计输出为 7FFFFFFF,这是 2147483647 的输出并要求下一个输入。

但是,这开始了一个无限循环,输出为:

7FFFFFFF
7FFFFFFF
7FFFFFFF
...

无限循环的原因是什么?

#include <iostream>
#include <limits>
#include <map>
#include <string>
#include <unistd.h>
using namespace std;

const int intMax = numeric_limits<int>::max();
const int intMin = numeric_limits<int>::min();
int num;

void createMap(map<string, char> *um){

    (*um)["0000"] = '0';
    (*um)["0001"] = '1';
    (*um)["0010"] = '2';
    (*um)["0011"] = '3';
    (*um)["0100"] = '4';
    (*um)["0101"] = '5';
    (*um)["0110"] = '6';
    (*um)["0111"] = '7';
    (*um)["1000"] = '8';
    (*um)["1001"] = '9';
    (*um)["1010"] = 'A';
    (*um)["1011"] = 'B';
    (*um)["1100"] = 'C';
    (*um)["1101"] = 'D';
    (*um)["1110"] = 'E';
    (*um)["1111"] = 'F';
}

string convertBinToHex(string bin){

    int l = bin.size();
    map<string, char> bin_hex_map;
    createMap(&bin_hex_map);

    int i = 0;
    string hex = "";

    while(i < bin.size()){
        hex += bin_hex_map[bin.substr(i, 4)];
        i += 4;
    }
    return hex;
}

void printHex(int num){

    int *var_ptr;
    var_ptr = &num;
    string bin = "";

    for (int i=31; i>=0; i--) {
        bin += to_string((*var_ptr >> i) & 1);
    }
    // cout << bin << endl;
    cout << convertBinToHex(bin) << endl;
}

int main(){

    string input = "";
    cout << "Enter I or LI or SI or Q" << endl;
    // cin >> input;
    while(input != "Q"){
        cin >> input;
        if(input == "LI"){
            cout << intMax << " ";
            printHex(intMax);
        }
        else if(input == "SI"){
            cout << intMin << " ";
            printHex(intMin);
        }
        else if(input == "I"){
            cin >> num;
            printHex(num);
            // sleep(2);
            // cout << "What is going on ?" << endl;
        }
        else
            break;
    }
    return 0;
}

问题不在于整数表示。就是输入的转换失败,这意味着它仍然会留在输入缓冲区中,导致你的无限循环一遍又一遍地读取完全相同的数据。

您需要检查输入是否成功,如果失败则需要清除缓冲区以及错误标志:

if (!(cin >> num))
{
    // Error, failed to parse the input

    // First clear the error status flags
    cin.clear();

    // Then remove the current line of input from the buffer
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
else
{
    // Input okay, use it...
}

由于为每个输入编写的内容很多,我建议您将其移出到您调用以获取输入的函数中。