"有符号和无符号整数表达式之间的比较"真的会导致错误吗?

Will 'comparison between signed and unsigned integer expressions' ever actually result in errors?

本文关键字:错误 真的 符号 无符号整数 之间 表达式 比较      更新时间:2023-10-16

通常我使用的对象将具有(有符号的)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() ) { ... }

是的,有,而且非常微妙。如果你好奇,你可以看看Stephan T. Lavavej关于算术转换的有趣演讲,以及Microsoft的STL实现中的一个错误,该错误是由有符号与无符号比较引起的。

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

在检查size()的特定情况下,为什么不首先使用类型 size_t 进行iSize?无符号值只是给你更大的表现力,使用它。

如果您不想将iSize声明为 size_t ,只需使用显式强制转换来明确表示您知道此比较的性质。编译器正试图通过这些警告帮你一个忙,正如你正确写的那样,在某些情况下,忽略它们会让你非常头疼。

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