library c++ c c++-standard-library c-standard-library

c++ - library - ¿Por qué no hay int128_t?



stl c++ (1)

Varios compiladores proporcionan tipos de enteros de 128 bits, pero ninguno de los que he utilizado proporciona el int128_t . ¿Por qué?

Por lo que recuerdo, el estándar

  • Reservas int128_t para este propósito
  • Alienta implementaciones que proporcionan ese tipo para proporcionar el typedef
  • Obliga que tales implementaciones proporcionen un intmax_t de al menos 128 bits

(y, no creo que haya usado una implementación que realmente se ajuste a ese último punto)


Me referiré al estándar C; Creo que el estándar C ++ hereda las reglas para <stdint.h> / <cstdint> de C.

Sé que gcc implementa enteros firmados y sin firmar de 128 bits, con los nombres __int128 y unsigned __int128 ( __int128 es una palabra clave definida por la implementación) en algunas plataformas.

Incluso para una implementación que proporciona un tipo estándar de 128 bits, el estándar no requiere la int128_t o uint128_t . Citando la sección 7.20.1.1 del borrador N1570 del estándar C:

Estos tipos son opcionales Sin embargo, si una implementación proporciona tipos enteros con anchuras de 8, 16, 32 o 64 bits, sin bits de relleno y (para los tipos firmados) que tienen una representación complementaria de dos, definirá los nombres typedef correspondientes.

C permite implementaciones a tipos enteros extendidos definidos cuyos nombres son palabras clave definidas por la implementación. __int128 de gcc y unsigned __int128 son muy similares a los tipos de entero extendido como se define en el estándar, pero gcc no los trata de esa manera. En cambio, los trata como una extensión de idioma.

En particular, si __int128 y unsigned __int128 fueran tipos de entero extendido , entonces se requeriría que intmax_t definiera intmax_t y uintmax_t como esos tipos (o como algunos tipos de al menos 128 bits de ancho). No lo hace; en cambio, intmax_t y uintmax_t son solo 64 bits.

Esto es, en mi opinión, desafortunado, pero no creo que haga gcc no conforme. Ningún programa portátil puede depender de la existencia de __int128 , o en cualquier tipo de entero de más de 64 bits.