Ответ 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 бита.