假如只有四位,数的取值范围是-8~7(1000~0111),溢出的结果可以用两数相加的结果模2^4,比如7+1=8,0111+0001=1000,求补码得(舍去1)0000,结果为0;7+5=12,0111+0101=1100,求补码得1100,结果为-4,7+3=10,0111+0011=1010,求补码得1110,结果为-6。
可以知道,溢出的结果是正确结果%2^k,k为位数,如:0=0%16,-4=12%16,-6=10%16。
题中数字取值:[-2^63,2^63],所以数字用long long型存储(8字节,64位)
A、B为正数时,能够产生溢出的运算结果范围是[2^63 + 1, 2^64],溢出后的结果范围:[(2^63+1)%2^64, 2^64%2^64],即[-2^63 - 1, 0],如果A+B结果在此范围内,则溢出。
A、B为负数时,能够产生溢出的运算结果范围是[-2^63 - 1, -2^64],溢出后的结果范围:[(-2^63-1)%2^64, 2^64%2^64],即[0, 2^63-1],如果A+B结果在此范围内,则溢出。
用cin读入会导致第三个测试点不通过。
1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 int main() 5 { 6 long long A, B, C,res, k; 7 cin >> k; 8 bool f; 9 for (int i = 0; i != k; ++i) 10 { 11 //cin >> A >> B >> C; 12 scanf("%lld%lld%lld",&A,&B,&C); 13 res = A + B; 14 if (A > 0 && B > 0 && res <= 0)//溢出 15 f = true; 16 else if (A < 0 && B < 0 && res >= 0) 17 f = false; 18 else//没有溢出 19 { 20 if (res > C) f = true; 21 else f = false; 22 } 23 if (f) 24 cout << "Case #" << i + 1 << ": true"; 25 else 26 cout << "Case #" << i + 1 << ": false"; 27 if (i != k - 1)cout << endl; 28 } 29 return 0; 30 }