Самая большая разница заключается в уровне предупреждения, при котором генерируются эти диагностические сообщения. C4018 — это предупреждение уровня 3. Попадает в категорию «вещи, которые нельзя игнорировать». Просто попробуйте ваш код с uc = 1 и c = -1 и подумайте, как 1 может быть меньше -1. Почти ни один программист не ожидает такого результата. Это делает его генератором ошибок и заслуживает видимой диагностики.
C4389 — предупреждение 4-го уровня. Попадает в категорию «выглядит неправильно, но, вероятно, все равно работает». Знаковость операндов не влияет на сравнение на равенство.
Уровень предупреждения по умолчанию — 3, если только вы не изменили настройку проекта. Это заставляет вас видеть диагностику «не следует игнорировать», а не диагностику «вероятно, все равно работает».