Всегда ли C99 требует, чтобы тип `int64_t` был доступен? - PullRequest
0 голосов
/ 28 февраля 2019

Требует ли стандарт C99, чтобы соответствующий компилятор определил (и использовал) 64-битный int64_t?Или это необязательно, и просто определяется всеми популярными компиляторами?Я явно спрашиваю конкретно о платформах, на которых ЦП не может напрямую обрабатывать 64-битные значения, но вопрос более общий

Я не могу понять это по типам данных CСтраница Википедии , а не этот ответ на связанный вопрос.

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Требует ли стандарт 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.На практике, однако, сегодня нет таких распространенных реализаций.

0 голосов
/ 28 февраля 2019

Требует ли стандарт C99, чтобы соответствующий компилятор определил 64-битный int64_t (и пригодный для использования)?

Нет, но C99 требует long long со значением минимум 64-бит.

Кроме того, int64_t очень широко доступен.Маловероятно, что вы встретите соответствующий C99 без int64_t, поскольку требуется почти на всех платформах.

C11dr 7.20.1.1 Целочисленные типы с точной шириной
(int64_t) .... если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для типов со знаком), которые имеют представление дополнения до двух, она должна определитьсоответствующие имена typedef.

Битовая ширина процессора не является фактором для этой функции - long long должно существовать.Если этот long long (или любой стандартный тип является 64-битным 2-х комплиментом), то int64_t должен также существовать.Битовая ширина процессора влияет на производительность .


@ R .. . Подчеркивается, что long long, для кодирования которого требуется 64-битная память,может, по спецификации, поддерживать только диапазон [-0x7fff-ffff-ffff-ffff ... + 0x7fff-ffff-ffff-ffff], один из int64_t диапазонов [-0x8000-0000-0000-0000 ... + 0x7fff-ffff-ffff-ffff].Такие платформы в наши дни чрезвычайно редки, если они существуют.

0 голосов
/ 28 февраля 2019

Существует три набора целочисленных типов :

  • intN_t - например, int64_t и их неподписанные аналоги;эти точные типы могут быть недоступны.
  • int_leastN_t - например, int_least64_t;требуются типы int_least8_t, int_least16_t, int_least32_t и int_least64_t и их неподписанные аналоги - другие типы являются необязательными.
  • int_fastN_t - например, int_fast64_t;требуются типы int_fast8_t, int_fast16_t, int_fast32_t и int_fast64_t (это самый быстрый тип с минимальной заданной шириной).

Стандарт также требует поддержки long long, а для минимально допустимого диапазона для long long требуется не менее 64 бит (см. §5.2.4.1 Размеры целочисленных типов <limits.h>).Поэтому стандарт может на законных основаниях требовать поддержки «наименьшего» и «быстрого» типов в 64 или более разрядах - для этого также требуется поддержка long long.

Раньше были компьютеры с 36-разрядными словамии другие с 60-битными словами.Оба из них не могли бы обеспечить (в основном, «не могли предоставить») типы точной ширины, но могут легко обеспечить поддержку типов «наименьший» и «быстрый».

Стандарт не предписывает«типы точной ширины» - см. §7.20.1.1 Целочисленные типы точной ширины ¶3 :

Эти типы являются необязательными.Однако если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для типов со знаком), которые имеют представление дополнения до двух, она должна определить соответствующие имена typedef.

0 голосов
/ 28 февраля 2019

Нет, C99 не требует тип int64_t.

(Спасибо @ user3386109, @Clifford)

Тип int64_t не требуется, чтобы быть доступным.Цитирование стандартного черновика документа C99 N1256 :

7.18.11.1 Целочисленные типы с точной шириной

  1. Имя определения типа int N _t обозначает целочисленный тип со знаком и т. д. и т. д. ...
  2. Эти типы являются необязательными.Однако, если реализация предоставляет целочисленные типы с шириной ... 64 бит ..., которые имеют представление дополнения до двух ..., она должна определить соответствующее имя typedef.

Но посмотритеОтветы @chux и @ JohnBollinger о long long с 64 битами.

...