我不明白为什么该解决方案有效。 (整数溢出)

问题描述 投票:1回答:1

对不起,标题不好,但是我不知道如何命名。我已经解决了一些练习问题,并且遇到了这个问题。面临的挑战是为一个盒子写一个类。因此它具有经度,高度和宽度。其中一种方法应该返回盒子的体积。这就像它的简历:

#include<bits/stdc++.h>

class Box {
private:
    int l,b,h;
public:
    Box(int L, int B, int H){
        l=L;b=B;h=H;
    }
    int CalculateVolume() {
        return b*l*h;
    } 
};

int main() {
    int l,b,h;
    std::cin << l << b << h;
    Box box(l, b, h);
    std::cout << box.CalculateVolume() << std::endl;
}

然后,当出现测试用例时,它给了我一个错误。

Input: 1039 3749 8473
Output: -1355615565

所以我说,好的结果太大。让返回类型更大

    long long int CalculateVolume() {
        return b*l*h;
    } 
// No changes to the rest

结果是一样的,所以我说:“还可以,然后做:

    unsigned long long int CalculateVolume() {
        return b*l*h;
    } 
// No changes to the rest
Input: 1039 3749 8473
Output: 18446744072353936051

令我高兴的是,我发现结果不是负面的。但是用mi计算器检查结果也不正确。因此,我将其存储在变量中以查看发生了什么。

    unsigned long long int CalculateVolume(){
        unsigned long long int volume = b*h*l;
        std::cout << volume << std::endl;
        return volume;
    } 
// No changes to the rest
Input: 1039 3749 8473
Output: 
18446744072353936051
18446744072353936051

我并没有因此而感到惊讶。经过最后的努力,我真的不知道这个想法是从哪里来的。

    unsigned long long int CalculateVolume(){
        unsigned long long int volume = b*h;
        unsigned long long int a = volume * l;
        return a;
    } 
// No changes to the rest

而且我很惊讶我得到了正确的答案

Input: 1039 3749 8473
Output: 33004122803

但是我真的不明白为什么。最重要的是,我是否应该在程序中执行此操作,以防万一它必须处理非常大的数字?还是应该如何处理?

对不起,标题不好,但是我不知道如何命名。我已经解决了一些练习问题,并且遇到了这个问题。面临的挑战是为一个盒子写一个类。因此它具有经度,...

c++ integer-overflow
1个回答
-1
投票

非常感谢您的帮助。如果变量是整数,则将运算结果分配给long long int并不重要,该运算将使用int数学完成。因此,我使用的临时解决方案是因为b * h仍然是一个没有问题的整数,然后当我将其乘以l时,它就一直将它们作为long int操作。这将是最终的解决方案:

© www.soinside.com 2019 - 2024. All rights reserved.