C++指针警告:算术溢出:对 4 字节值使用运算符'-',然后将结果转换为 8 字节值



当我运行此函数时,它会为setw(*torPtr - *harePtr)setw(*harePtr - *torPtr)发出2警告

上面写着:

算术溢出:对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';
}
}

在使用Visual Studio时,我也会遇到此错误。在查看了我从#include <iomanip>链接的setw之后,我发现setw提供了一个参数streamsize,它实际上是一个long long

由此产生的问题似乎是,您试图将两个int(大小为4字节(的算术结果转换为一个long long(大小为8字节(,以符合setwstreamsize的定义。

算术运算引起的溢出不会产生正确的结果。如果你想了解溢出是如何造成的,你可以看看下面的网络文章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风格改为静态。谢谢你的贡献,阿那斯塔库!

相关内容

  • 没有找到相关文章

最新更新