检查一个10位数组,是否溢出int类型的数据
3种方法:
1.检查后9位
2.检查前9位
3.用long类型计算结果 然后比较
//检验10位大小溢出问题————long类型 long result = 0; //##定义为long类型 for(i=0;i<len;i++) result = result*10 +s[i] ; //## 数组->整数 printf("%ld\n",result); if(sign==1 && result > INT_MAX) return INT_MAX; else if(sign==-1 && result-1 > INT_MAX) //##result-1>INT_MAX 否则溢出--> INT_MAX+1 return INT_MIN; return result;
//检验10位大小溢出问题 //法1:int类型, //判断 后9位 ? INT_MAX的后9位 //len>10 溢出 //len==10, 最高位>2时,溢出 最高位==2时,正数result>INT_MAX-2000000000溢出 负数result>INT_MAX-2000000000+1溢出 if(len==10) { if(s[0] > 2) { flag = -1; } if(s[0]==2) { for(i = len-1;i>=1;i--) { result += s[i]*times; times *=10; } if(symbol==-1 && result>INT_MAX-2000000000+1) flag = -1; if(symbol== 1 && result>INT_MAX-2000000000) flag = -1; } } //法2:在相加的时候就比较大小 //判断 前9位 ? INT_MAX的前9位 if(sign==1&&(INT_MAX/10<ans || (INT_MAX/10==ans&&INT_MAX%10<=tmp))) return INT_MAX; else if(sign==-1&&(-(INT_MIN/10)<ans || (-(INT_MIN/10)==ans&&-(INT_MIN%10)<=tmp))) return INT_MIN; for(i = 0;i<len;i++) { if(i == 9) { if(sign==1) if( result>INT_MAX/10 || (result==INT_MAX/10 && s[i]>=INT_MAX%10))//溢出 return 0; if(sign==-1) if( result>INT_MAX/10 || (result==INT_MAX/10 && s[i]>=INT_MAX%10+1))//溢出 return 0; } result = result*10 +s[i]; } //法3:用long类型计算结果,然后比较与INT_MAX的大小 //最简单