C++:仅使用无符号类型时有符号/无符号不匹配

Nub*_*bok 5 c++ unsigned signed unsigned-integer

当我尝试使用启用了警告级别/ W4的Visual Studio 2010 C++编译器(X86)编译以下C++程序时,我在标记的行处收到签名/未签名的不匹配警告.

#include <cstdio>
#include <cstdint>
#include <cstddef>

int main(int argc, char **argv)
{
    size_t idx = 42;
    uint8_t bytesCount = 20;

    // warning C4389: '==' : signed/unsigned mismatch
    if (bytesCount + 1 == idx)
    {
        printf("Hello World\n");
    }

    // no warning
    if (bytesCount == idx)
    {
        printf("Hello World\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

这让我很困惑,因为我只使用无符号类型.自从比较

bytesCount == idx
Run Code Online (Sandbox Code Playgroud)

没有引起这样的警告,这可能与这里发生的一些奇怪的隐性对话有关.

因此:我得到这个警告的原因是什么,以及这种对话发生的规则(如果这是原因)?

pat*_*ros 9

1是带符号的文字.尝试bytesCount + 1U.

由于添加了有符号和无符号值(bytesCount + 1),编译器可能正在创建签名类型的临时值


MSN*_*MSN 5

1是一个int.整数算术表达式的类型取决于所涉及的类型.在这种情况下,您有一个unsigned类型和signed类型,其unsigned类型小于signed类型.这属于表达式的C++标准(第5.10节[expr]):

否则,如果具有有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数应转换为具有有符号整数类型的操作数的类型.

即,表达式的类型bytesCount + 1是int在缺省情况下签署.