Игры с некоторыми источниками нашли такой код:Проверьте, без знака меньше нуля
void foo(unsigned int i)
{
if(i<0)
printf("Less then zero\n");
else
printf("greater or equ\n");
}
int main()
{
int bar = -2;
foo(bar);
return 0;
}
Я думаю, нет смысла, но может быть есть некоторые случаи (безопасность?), Что делает эту проверку SensAble?
Спасибо за ваши ответы! Вы укрепили мою уверенность. Но кто-то написал это. Может быть, есть некоторые платформы или компиляторы, которые думают иначе? – dtoch
Может быть небольшое изменение точных значений для конверсий с подписью/без знака в зависимости от размера int в вашей системе (см. Ответы, связанные с jonnyGold и wap26). Но все компиляторы выдают исполняемые файлы, которые в этом случае демонстрируют одно и то же поведение потока управления. Другими словами - нет :) Тот, кто написал это, вероятно, не заметил, что эта ситуация с потоком контроля (ошибка) или же они экспериментируют. – erapert
Кажется, что ты прав. Я проверил несколько проверок. НКУ просто удаляет любые проверки и написать строку: 'Foo: PushL% EBP MOVL% особ,% EBP subl $ 24,% особ MOVL $ .LC0, (% особ) вызов ставит оставить ret' Clang генерирует чек, но: 1. недействительного Foo (беззнаковый INT I) рядного 'Foo + 19: Jae 0x804841f' 2. аннулируется Foo (подпись INT I): рядного 'Foo + 19: JGE 0x804841f ' –
dtoch