Этот вопрос связан с определением максимального значения подписанного типа во время компиляции:
C вопрос: off_t (и другие подписанные целочисленные типы) минимальные и максимальные значения
Однако с тех пор я понял, что определение максимального значения подписанного типа (например, time_t или off_t) в время выполнения представляется очень сложной задачей.
Самое близкое к решению, о котором я могу думать, это:
uintmax_t x = (uintmax_t)1<<CHAR_BIT*sizeof(type)-2;
while ((type)x<=0) x>>=1;
Это позволяет избежать любого цикла, пока type не имеет битов заполнения, но если type имеет биты заполнения, то листинг вызывает поведение, определяемое реализацией, которое может быть сигналом или бессмысленным преобразованием, определенным реализацией (например, снятие знакового бита).
Я начинаю думать, что проблема неразрешима, что немного неудобно и, по-моему, будет дефектом в стандарте C. Любые идеи для доказательства того, что я не прав?