尝试读取大于 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 = #
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...
}
由于为每个输入编写的内容很多,我建议您将其移出到您调用以获取输入的函数中。
我正在编写一些 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 = #
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...
}
由于为每个输入编写的内容很多,我建议您将其移出到您调用以获取输入的函数中。