尝试读取大于INT_MAX的int时发生无限循环

问题描述

这是我的第一个问题,请客气:)

因此,我正在编写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...
}

由于每次输入都要写很多东西,因此建议您将其移到调用获取输入的函数中。