gpt4 book ai didi

c++ - 'comparison between signed and unsigned integer expressions' 真的会导致错误吗?

转载 作者:可可西里 更新时间:2023-11-01 17:56:16 27 4
gpt4 key购买 nike

通常我使用的对象会有(有符号的)int 参数(例如 int iSize),这些参数最终会存储某物应该有多大。同时,我经常将它们初始化为 -1 以表示对象(等)尚未设置/尚未填充/尚未准备好使用。

当我执行类似 if( iSize >= someVector.size() ) { ... } 的操作时,我经常以警告结束 comparison between signed and unsigned integer.

因此,名义上我不想使用unsigned int。在任何情况下这会导致错误或意外行为吗?

如果不是:处理此问题的最佳方法是什么?如果我使用编译器标志 -Wno-sign-compare 我可能(假设地)错过我应该使用 unsigned int 的情况(或类似的东西)。因此,在与 unsigned int 进行比较时,我应该只使用强制转换吗? if( iSize >= (int)someVector.size() ) { ... } ?

最佳答案

是的,有,而且非常微妙。好奇的可以查看this interesting presentation Stephan T. Lavavej 关于算术转换和 Microsoft 的 STL 实现中的错误,该错误仅由有符号与无符号比较引起。

一般来说,问题是由于补码 2 运算,非常小的负整数值与非常大的无符号整数值(例如 -1 = 0xFFFF = 65535)具有相同的位表示。

在检查size()的具体情况下,为什么不使用类型 size_t对于 iSize首先?无符号值只会给你更大的表现力,使用它。

如果你不想申报iSize作为size_t , 只需使用显式强制转换就可以清楚地表明您了解此比较的性质。编译器试图通过这些警告帮您一个忙,正如您所写的那样,在某些情况下,忽略它们可能会让您非常头疼。

因此,如果iSize有时是负数(并且应该被评估为小于 unsigned int 的所有 size() 值),使用成语: if ((iSize < 0) || ((unsigned)iSize < somevector.size())) ...

关于c++ - 'comparison between signed and unsigned integer expressions' 真的会导致错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14553017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com