Является ли intmax_t таким же, как long long int?

В POSIX intmax_t обозначается целочисленный тип со знаком, способный представлять любое значение любого целочисленного типа со знаком.

Было бы правильно, что в C99/C11, что intmax_t всегда имеет тот же размер, что и long long int?

Ответ 1

Нет. intmax_t может быть расширенным целым типом, большим, чем long long. Я не знаю никаких систем, которые были определены как таковые, но вы не должны предполагать в коде приложения, что они одинаковы. (Предполагая, что они одинаковы в коде ОС, может быть приемлемым, если ваша операционная система всегда гарантирует это, но это, вероятно, плохая идея.)

Ответ 2

C99 N1256 стандартная черновик

6.2.5 Типы говорят нам о "расширенных типах целочисленных подписей":

4 Существует пять стандартных стандартных целочисленных типов, обозначенных как подписанный char, короткий int, int, long int и long long int. (Эти и другие типы могут быть обозначенный несколькими дополнительными способами, как описано в 6.7.2.) Также может быть реализационные расширенные знаковые целые типы Стандартная и расширенная знаковые целочисленные типы совместно называются целыми типами со знаком. 29)

29) Поэтому любое утверждение в этом стандарте о знаковых целых типах также относится к расширенному значных целых типов.

7.18.1.5 Целочисленные числа наибольшей ширины говорят, что intmax_t - это максимально возможный "целочисленный тип со знаком", в том числе расширенные:

1 Следующий тип обозначает знаковый целочисленный тип, способный представлять любое значение любой знаковый целочисленный тип:

intmax_t

6.4.4.1. Целочисленные константы затем ясно показывают, что расширенные целые типы могут быть больше любого из стандартных:

6 Если целочисленная константа не может быть представлена ​​каким-либо типом в ее списке, она может иметь расширенный целочисленный тип, если расширенный целочисленный тип может представлять его значение.

Ответ 3

Если long и long long имеют ту же ширину и представление, что они часто делают, long можно выбрать для intmax_t.