Dil*_*rix 8 c++ int comparison unsigned warnings
通常我使用的对象将具有(签名的)int参数(例如int iSize),这些参数最终存储了应该有多大的东西.同时,我经常将它们初始化-1为表示对象(等)尚未设置/尚未填充/尚未准备好使用.
comparison between signed and unsigned integer当我做类似的事情时,我常常会收到警告if( iSize >= someVector.size() ) { ... }.
因此,我名义上不想使用unsigned int.是否存在导致错误或意外行为的情况?
如果不是:处理这个问题的最佳方法是什么?如果我使用编译器标志,-Wno-sign-compare我可以(假设)错过我应该使用unsigned int(或类似的东西)的情况.那么在与unsigned int--eg 比较时我应该使用一个演员if( iSize >= (int)someVector.size() ) { ... }吗?
是的,有非常微妙的.如果你很好奇,你可以查看Stephan T. Lavavej关于算术转换的这个有趣的演示文稿以及微软实施STL的一个错误,它只是由签名与无符号比较引起的.
通常,问题是由于补码2算法的原因,非常小的负积分值具有与非常大的无符号整数值(例如-1 = 0xFFFF = 65535)相同的位表示.
在检查的特定情况下size(),为什么不使用类型size_t为iSize摆在首位?无符号值只会给你更大的表现力,使用它.
如果您不想声明iSize为size_t,请通过使用显式转换来清楚地了解此比较的性质.编译器试图帮助你处理这些警告,并且正如你所写的那样,可能存在忽略它们会导致你非常头疼的情况.
因此,如果iSize有时是负面的(并且应该评估为小于所有unsigned int值size()),请使用成语:if ((iSize < 0) || ((unsigned)iSize < somevector.size())) ...