尝试读取大于int_MAX的int时的无限循环



我正在编写一些C++代码,以计算整数的内部表示。但我偶然发现了一个奇怪的bug,我似乎无法解释这个问题的原因。

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

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

一切都很完美,直到我输入

I 2147483648

现在,这比C++中的最大整数(2147483647(大一。

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

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

7FFFFFFF
7FFFFFFF
7 FFFFFFF
。。。

这个无限循环的原因是什么?

#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...
}

由于每个输入都需要编写大量内容,因此我建议您将其移到一个调用以获取输入的函数中。

最新更新