当我运行此函数时,它会为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字节(,以符合setw
中streamsize
的定义。
算术运算引起的溢出不会产生正确的结果。如果你想了解溢出是如何造成的,你可以看看下面的网络文章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风格改为静态。谢谢你的贡献,阿那斯塔库!