一个有趣的计算机基础知识题

  • 2019-04-09
  • 59
  • 0

题目描述:

给定两个带符号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),所以说这属于计算机基础知识的范畴^_^

评论

还没有任何评论,你来说两句吧

发表评论