8

通常,我使用的对象将具有(签名的)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() ) { ... }吗?

4

1 回答 1

5

是的,有,而且非常微妙。如果您好奇,可以查看Stephan T. Lavavej 的这个有趣的演示文稿,内容是关于算术转换和 Microsoft 的 STL 实现中的一个错误,该错误仅由有符号与无符号比较引起。

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

在检查的特定情况下size(),为什么不首先使用 type size_tforiSize呢?无符号值只会给你更大的表现力,使用它。

如果您不想声明iSizesize_t,只需通过使用显式强制转换来明确说明您知道这种比较的性质。编译器试图帮助您处理这些警告,正如您正确写的那样,在某些情况下,忽略它们可能会让您非常头疼。

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

于 2013-01-27T22:36:07.383 回答