数据溢出
如果输入数值大于声明的整型,会发生什么?
#include<iostream>
int main()
{
using namespace std;
short int n1,n2;
cin>>n1;
cin>>n2;
cout<<"n1:"<< n1 <<" n2:"<< n2 <<endl;
return 0;
}
编译运行,输入31600000,输出:
n1:32767 n2:0
n1的值为32767,该数字的二进制表示为111111111111111,是short int类型所能表示的最大正数。n2却为0。这是因为std::cin 将 31600000 写入 short int类型时,发现了错误,将自己的 fail 成员设置为 true,之后继续调用std::cin 不会读取缓冲区或触发用户输入。
我们可以使用std::cin.clear()消除错误,使std::cin可以继续工作。
#include<iostream>
int main()
{
using namespace std;
short int n1,n2;
cin >> n1;
cin >> n2;
cout<<"n1:"<< n1 <<" n2:"<< n2 << endl;
if (cin.fail() == true)
{
cout << "cin.fail() == true\n";
cin.clear();
cout << "cin can work now\n";
}
cin >> n2;
cout << "n1:"<< n1 <<" n2:"<< n2 << endl;
return 0;
}
编译运行,输入31600000,输出:
31600000
n1:32767 n2:0
cin.fail() == true
cin can work now
31600000
n1:32767 n2:32767
总结:
使用 cin 读取数据产生错误,如果不进行特殊处理,则之后调用 cin 也无法正常读取缓冲区或触发用户输入;cin.clear() 可以清除错误。