Когда я пытаюсь скомпилировать следующую программу на C++ с помощью компилятора Visual Studio 2010 C++ (X86) с включенным уровнем предупреждения /W4, я получаю предупреждение о несоответствии знака и без знака в отмеченной строке.
#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");
}
}
Это меня смущает, поскольку я использую только беззнаковые типы. Поскольку сравнение
bytesCount == idx
не вызывает такого предупреждения, вероятно, это связано с каким-то странным неявным разговором, который происходит здесь.
Итак: по какой причине я получаю это предупреждение и по каким правилам происходит этот разговор (если причина в этом)?