C++ 指针警告:算术溢出:对 4 字节值使用运算符“-”,然后将结果转换为 8 字节值
Posted
技术标签:
【中文标题】C++ 指针警告:算术溢出:对 4 字节值使用运算符“-”,然后将结果转换为 8 字节值【英文标题】:C++ pointer Warning: Arithmetic overflow: Using operator '-' on a 4-byte value and then casting the result to an 8-byte value 【发布时间】:2020-04-16 22:40:19 【问题描述】:当我运行这个函数时,它给我一个setw(*torPtr - *harePtr)
和setw(*harePtr - *torPtr)
的警告
上面写着:
算术溢出:对 4 字节值使用运算符“-”,然后将结果转换为 8 字节值。在调用运算符“-”之前将值转换为更广泛的类型以避免溢出 (io.2)。
请问我该如何解决这个问题?
void Posi(const int* const tPtr,const int* const hPtr)
if (*hPtr == *tPtr)
cout <<setw(*hPtr) << "bang!" << '\a';
else if (*hPtr < *tPtr)
cout << setw(*hPtr) << 'H' << setw(*tPtr - *hPtr) << 'A';
else
cout << setw(*tPtr) << 'T' << setw(*hPtr - *tPtr) << 'B';
【问题讨论】:
我无法重现,一切正常wandbox.org/permlink/jfz1q5uZoUKoDcdS,问题一定是其他问题,发帖minimal reproducible example 哇,当没有演员表时,错误消息抱怨“演员表”?这里的术语应该是“转换”。编译器编写者应该知道其中的区别。 ***.com/questions/59308422/… 的副本? 【参考方案1】:使用 Visual Studio 时,我也收到此错误。
在查看了我从#include <iomanip>
链接的setw
之后,我发现setw
提供了一个参数streamsize
,它实际上是一个long long
。
由此产生的问题似乎是您试图将两个int
(大小为4字节)的算术结果转换为long long
(大小为8字节)以符合定义streamsize
在setw
.
算术运算导致的溢出不会产生正确的结果。 想了解溢出是如何产生的,可以看下面的网络文章https://www.cplusplus.com/articles/DE18T05o/。
要解决此问题,您需要防止发生溢出,这可以通过将值转换为更大的数据类型来实现。例如:
const long long value_cast = static_cast<long long>(*tPtr) - static_cast<long long>(*hPtr);
cout << setw(*hPtr) << 'H' << setw(value_cast) << 'A';
我希望这能回答您的问题。 :)
编辑: 我将演员阵容从 c 风格更改为静态。感谢您的贡献anastaciu!
【讨论】:
很好看,似乎就是这样,因为这是 C++,最好使用 C++ 风格的演员static_cast<long long>(*tPtr)
等。
答案是有效的。非常感谢您的帮助
仅供参考:尽管在错误消息中(错误地)使用了“casting”一词,但原始代码中没有强制转换。有转换,这就是编译器应该抱怨的。强制转换是您在源代码中编写的内容,用于告诉编译器进行转换。 +1。以上是关于C++ 指针警告:算术溢出:对 4 字节值使用运算符“-”,然后将结果转换为 8 字节值的主要内容,如果未能解决你的问题,请参考以下文章