Требует ли стандарт C99, чтобы соответствующий компилятор определил 64-битный int64_t (и пригодный для использования)?Или это необязательный параметр, который просто определяется всеми популярными компиляторами?
Тип является необязательным в одном смысле и условно обязательным в другом смысле.В частности, C99 говорит ,
Имя typedef intN_t обозначает целочисленный тип со знаком с шириной N, без битов заполнения и представление дополнения до двух.[...]
Эти типы являются необязательными.Однако если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для типов со знаком), которые имеют представление дополнения до двух, она должна определить соответствующие имена typedef.
Таким образом, int64_t
является необязательным в том смысле, что соответствующая реализация не обязана предоставлять какой-либо тип, который точно соответствует характеристикам int64_t
, а если нет, то в этом нет необходимости(действительно, согласно другому разделу, не должен предоставлять тип int64_t
.
C99 действительно указывает, что существует тип long long int
, требуемый минимальный диапазон которого требует представления шириной не менее 64 бит).Теперь возможно, что в некоторых реализациях не существует целочисленного типа со знаком , равного 64 битам (например, возможно, int
равен 24 битам, long
48 и long long
96), и этовозможно, что существует 64-битное целочисленное значение, но оно содержит биты заполнения или не представлено в дополнении к двум.Такие реализации могут быть полностью соответствующими и все же не определять int64_t
.На практике, однако, сегодня нет таких распространенных реализаций.