数据存储范围

今天遇到一个非常弱智的问题,但是之前编程的时候都是自己做实验,没有考虑过工程的因素,比如:数据的取值范围。
一个简单的时间换算程序:
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。
所以,在以后写工程代码的时候,一定要考虑数据的取值范围,用合适的数据类型存储相应的变量,而且很重要的一点就是要先设置错误输出分支(高亮部分),在较大的工程项目中,不敢保证用户的输入都是合法的,避免长时间找不出问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值