Этот вопрос связан с определением максимального значения подписанного типа во время компиляции:
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. Любые идеи для доказательства того, что я не прав?