如何修复整数溢出警告

How to fix integer overflow warning

本文关键字:警告 溢出 整数 何修复      更新时间:2023-10-16

我有一些代码,可以检查整数是否在[-2^31 1,2^31-1]范围内。但是,在汇编过程中,会引发整数溢出警告。

long int tmp_l = strtol(tokens[8].c_str(),NULL,10);
if (tmp_l >= ( (int32_t)-1 * ( ((int32_t)1<<31) - (int32_t)1) ) && 
        tmp_l <= ( ((int32_t)1 << 31) - (int32_t)1) ) {
    long int in_range = tmp_l;
} else {
    cerr << "ERROR: int not in range. Expected [(-2^31)-1, (2^31)-1]. ";
    cerr << "Found: " << tmp_l << endl;
}
main.cpp:93:51: warning: integer overflow in expression [-Woverflow]
     if (tmp_l >= ((int32_t)-1 * (((int32_t)1<<31) - (int32_t)1) ) &&
                                  ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~

该代码良好,我还没有看到与此警告相关的运行时错误。我要去哪里?

我要去哪里?

2^31-1是由32位签名的整数表示的最大整数。因此,1 << 31操作的结果为2^31不在代表值的范围内。

签名溢出的行为是未定义的。

如何修复

您可以使用此方法:

if (tmp_l >= std::numeric_limits<int32_t>::min() + 1
 && tmp_l <= std::numeric_limits<int32_t>::max()