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 &lt;iomanip&gt; 链接的setw 之后,我发现setw 提供了一个参数streamsize,它实际上是一个long long

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

算术运算导致的溢出不会产生正确的结果。 想了解溢出是如何产生的,可以看下面的网络文章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&lt;long long&gt;(*tPtr) 等。 答案是有效的。非常感谢您的帮助 仅供参考:尽管在错误消息中(错误地)使用了“casting”一词,但原始代码中没有强制转换。有转换,这就是编译器应该抱怨的。强制转换是您在源代码中编写的内容,用于告诉编译器进行转换。 +1。

以上是关于C++ 指针警告:算术溢出:对 4 字节值使用运算符“-”,然后将结果转换为 8 字节值的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的算术溢出添加2个DWORD

警告 C26451:算术溢出(减去两个整数时)

算术溢出:对 4 字节值使用运算符“*”,然后将结果转换为 8 字节值

警告 C26451 算术溢出:使用运算符“-”

C 指针的算术运算

C 指针的算术运算