【问题标题】:can someone tell why am i getting this error?有人能告诉我为什么会收到这个错误吗?
【发布时间】:2021-06-13 11:23:54
【问题描述】:

我试图解决这个问题:Third Maximum Number

但我遇到了这个错误

第 4 行:字符 37:运行时错误:有符号整数溢出:-9223372036854775808 - 10 不能用“long long”类型表示(solution.cpp) 摘要:UndefinedBehaviorSanitizer:undefined-behavior prog_joined.cpp:13:37

这是我的代码

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        long long int mx = LLONG_MIN-10;
        long long int second_mx = LLONG_MIN-10;
        long long int  third_mx = LLONG_MIN-10;
        for(int i=0; i<nums.size(); i++){
            if(nums[i] > mx){
                mx = nums[i];
            }
        }
        
        for(int i=0; i<nums.size(); i++){
            if(nums[i] != mx){
                if(nums[i] > second_mx){
                    second_mx = nums[i];
                }
            }
        }
        
        for(int i=0; i<nums.size(); i++){
            if(nums[i] != mx && nums[i] != second_mx){
                if(nums[i] > third_mx){
                    third_mx = nums[i];
                }
            }
        }
        if(third_mx == LLONG_MIN){
            return mx;
        }
        return third_mx;
    }
};

谁能告诉我这个错误的真正含义是什么?

【问题讨论】:

  • 您使用什么编译器标志?您应该收到一些关于return mx 的可怕编译器警告,因为您的方法的返回类型是int,但mxlong long intint 通常是int32_t,而long long int 通常是int64_t)。如果您收到这些警告,为什么不在继续之前修复它们?
  • 正如它所说的那样。 LLONG_MIN-10 的结果不能存储在long long(又名long long int)中。想想看。 LLONG_MIN 是可以存储在long long 中的最小值(负值最远离零,因为long longsigned 类型)。 LLONG_MIN-10 小于该最小值,因此不能存储在 long long 中。

标签: c++


【解决方案1】:

线

long long int mx = LLONG_MIN-10;

LLONG_MINlong long int可以存储的最小值,减去10。显然,这个值不能再存储在long long中,所以这会导致溢出,which results in undefined behavior

您的程序使用Undefined Behavior Sanitizer 运行,它检测到这一点并给您错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2021-05-02
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多