如何修复整数溢出警告
How to fix integer overflow warning
我有一些代码,可以检查整数是否在[-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()
相关文章:
- 警告处理为错误这里有什么问题
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- 获取隐式转换溢出从无符号到已签名的警告
- MSVC C6029 警告:缓冲区可能溢出,使用未经检查的值.检查缓冲区大小时,警告不会消失
- 警告C26451:算术溢出
- 如何修复整数溢出警告
- 警告C4307在C中积分常数溢出
- Visual Studio 2008 运行时堆栈溢出警告,当运算符在所有路径上<递归时警告
- 为什么唯一的带符号整数类型会导致clang中的溢出警告
- 为什么在Visual Studio 2012上的代码分析中,此代码会发出缓冲区溢出警告(C6385/C6386)
- GCC编译器警告溢出
- 是什么原因导致此缓冲区溢出警告超过64位VS2012编译环境
- -函数定义中的Wstrict溢出警告
- 长类型Max等于int Max error + math.h pow()编译警告:隐式常量转换溢出