今天遇到一个非常弱智的问题,但是之前编程的时候都是自己做实验,没有考虑过工程的因素,比如:数据的取值范围。
一个简单的时间换算程序:
int days, hours, minutes, seconds;
cout << "请用户以整数的方式输入秒数:";
long long time;
cin >> time;
days = time / (hoursPerDay * minsPerHour * secondsPerMinute);
hours = (time - days * (hoursPerDay * minsPerHour * secondsPerMinute)) /
(minsPerHour * secondsPerMinute);
minutes = (time - days * (hoursPerDay * minsPerHour * secondsPerMinute) - hours *
(minsPerHour * secondsPerMinute)) / (secondsPerMinute);
seconds = time - days * (hoursPerDay * minsPerHour * secondsPerMinute) - hours *
(minsPerHour * secondsPerMinute) - minutes * secondsPerMinute;
if (hours >= 24 || minutes >= 60 || seconds >= 60)
{
cout << "输入值过大,超过计算范围,计算失败!" << endl;
}
else
{
cout << time << " seconds = " << days << " days, " << hours << " hours, " << minutes
<< " minutes, " << seconds << " seconds." << endl;
}
输入小的数时没有问题,但是当输入大的数时,就会跳转到错误分支。然后我用了一个循环测试一下到底输入超过多大时会跳转到错误分支:
for (int i = 2147479999; ; i++)
{
if (i <= 0)
{
cout << "i = " << i << "\ni-1 = " << i-1 << '\n' << endl;
break;
}
}
结果是:
突然反应过来,这好像跟计算机的存储方式(二进制存储)有关:
int powOfTwo = 1;
for (int e = 1; e <= 32; e++)
{
powOfTwo *= 2;
cout << e << "powOfTwo\t=\t" << powOfTwo << endl;
}
果然,跟我想的一样, int 型最多保存(-2^-32) ~ (2^32-1),即:-2147483648~2147483647。
所以,在以后写工程代码的时候,一定要考虑数据的取值范围,用合适的数据类型存储相应的变量,而且很重要的一点就是要先设置错误输出分支(高亮部分),在较大的工程项目中,不敢保证用户的输入都是合法的,避免长时间找不出问题。