Я также не могу делать предположений относительно соответствующих размеров типов off_t и size_t.
Чтобы сравнить смешанные типы со знаком, чьи сопоставимые диапазоны четко не связаны, приведите к uintmax_t
.
Как только код узнает, что signed fsize >= 0
истинно, приведение к широкому типу unsigned , например uintmax_t
, определенно не сузит значение fsize
и не заглушит предупреждение.
if (fsize >= 0 && (uintmax_t) fsize <= SIZE_MAX) {
Если приведение к uintmax_t
слишком велико, я бы ожидал, что компилятор по-прежнему будет генерировать эффективный код.