Подтвердить что ты не робот

Сравнение int с size_t

Если у меня есть переменная int и size_t, могу ли я сравнить их как:

int i=1;
size_t y=2;
if(i==y)
do something..

или мне нужно набрать одно из них?

4b9b3361

Ответ 1

Это безопасно, если int равен нулю или положителен. Если он отрицательный и size_t имеет равный или более высокий ранг чем int, то int будет преобразован в size_t, и поэтому его отрицательное значение вместо этого станет положительным. Это новое положительное значение затем сравнивается со значением size_t, которое может (в ошеломляюще маловероятном совпадении) давать ложное положительное значение. Чтобы быть по-настоящему безопасным (и, возможно, чрезмерно осторожным), убедитесь, что int неотрицателен первым:

/* given int i; size_t s; */
if (i>=0 && i == s)

и для подавления предупреждений компилятора:

if (i>=0 && (size_t)i == s)

Ответ 2

size_t будет неким типом целочисленного типа (хотя, возможно, без знака, поэтому он может генерировать предупреждение), поэтому для вас должно быть выполнено соответствующее кастинг.

Как уже говорили другие, вы можете захотеть пересмотреть все вычисления, создающие int, и посмотреть, можете ли вы сделать это в size_t, в первую очередь, если вы вычисляете требуемый размер для чего-то.

Ответ 3

Можно сравнить значение size_t со значением int, значение int будет неявно преобразовано в тип unsigned.

Некоторые компиляторы выдают предупреждение при смешивании типов signed и unsigned при сравнении. В этом случае вы можете явно преобразовать значение signed в соответствующий тип unsigned для подавления предупреждения.