Подтвердить что ты не робот

Почему нет int128_t?

Несколько компиляторов предоставляют 128-битные целочисленные типы, но ни один из тех, которые я использовал, не содержит typedefs int128_t. Почему?

Насколько я помню, стандартный

  • Резервы int128_t для этой цели
  • Поощряет реализации, которые предоставляют такой тип для обеспечения typedef
  • Указывает, что такие реализации обеспечивают intmax_t не менее 128 бит

(и, я не верю, что я использовал реализацию, которая фактически соответствует этой последней точке)

4b9b3361

Ответ 1

Я буду ссылаться на стандарт C; Я думаю, что стандарт С++ наследует правила для <stdint.h>/<cstdint> от C.

Я знаю, что gcc реализует 128-битные и беззнаковые целые числа с именами __int128 и unsigned __int128 (__int128 - ключевое слово, определенное для реализации) на некоторых платформах.

Даже для реализации, которая обеспечивает стандартный 128-битный тип, стандарт не требует определения int128_t или uint128_t. Выделите раздел 7.20.1.1 проекта N1570 стандарта C:

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

C разрешает реализации определенным расширенным целым типам, имена которых являются ключевыми словами, определяемыми реализацией. gcc __int128 и unsigned __int128 очень похожи на расширенные целые типы, определенные стандартом, но gcc не обрабатывает их таким образом. Вместо этого он рассматривает их как расширение языка.

В частности, если __int128 и unsigned __int128 были расширенными целыми типами, тогда gcc потребовалось бы определить intmax_t и uintmax_t как эти типы (или как некоторые типы шириной не менее 128 бит). Это не так; вместо этого intmax_t и uintmax_t всего 64 бит.

Это, на мой взгляд, несчастливо, но я не верю, что это делает gcc несоответствием. Никакая переносная программа не может зависеть от существования __int128 или любого целочисленного типа, более широкого, чем 64 бита.