一个有趣的计算机基础知识题
题目描述:
给定两个带符号64位整形(long long)范围内的整数a和b,输出a除以b的商(这里的除为整除,商为整除结果中商…余数中的商)
样例:
样例输入 | 样例输出 |
2019 20 | 100 |
2019 -20 | -100 |
-2019 -20 | 100 |
-2019 20 | -100 |
提示:
请输出正常的64位整数,不要输出如1.0、-0、2.134e+12的形式!
·
·
·
坑点所在:
#include <stdio.h>
int main() {
long long a, b;
scanf("%lld%lld", &a, &b);
printf("%lld\n", a/b);
}
如果你提交这样一份c/c++代码,那你就错了!
如上代码,当输入a=-9223372036854775808,b=-1时,输出的结果是(Windows)-9223372036854775808或(Linux)Floating point exception,这显然是错误的!
p.s. 上面所说的输出结果是在gcc/g++编译器下的结果,clong和visual studio编译器的输出未进行测试。
按照常理去想,两个long long的数相除,结果必然是long long范围内的数。(两个int范围内的数相除同理)
但实际这是错误的,其中存在例外,long long的范围是-2^63(-9223372036854775808)至2^63-1(9223372036854775807)。当进行-9223372036854775808除以-1运算时,正确的结果是9223372036854775808,造成了溢出,所以导致答案错误。
p.s. long long中-2^63的二进制位为10000000…0000(符号位为1,后跟63个0),所以说这属于计算机基础知识的范畴^_^
发表评论