¿Se garantiza que 'long' tenga al menos 32 bits?
Al leer el Estándar C ++, siempre he entendido que los tamaños de los tipos fundamentales integrales en C ++ fueron los siguientes:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Lo deduje de 3.9.1 / 2:
Hay cuatro tipos de enteros con signo: "char firmado", "int corto", "int" y "int largo". En esta lista, cada tipo proporciona al menos tanto almacenamiento como los que le preceden en la lista. Las entradas simples tienen el tamaño natural sugerido por la arquitectura del entorno de ejecución.Además, el tamaño dechar
se describe en 3.9.1 / como:
1.7 / 1 define esto en términos más concretos:
La unidad de almacenamiento fundamental en el modelo de memoria C ++ es el byte. Un byte es al menos lo suficientemente grande como para contener cualquier miembro del conjunto de caracteres de ejecución básica y está compuesto por una secuencia contigua de bits, cuyo número está definido por la implementación.Esto me lleva a la siguiente conclusión:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
dóndesizeof
nos dice cuántos bytes tiene el tipo. Además, se define la implementación cuántos bits hay en un byte. La mayoría de nosotros probablemente estamos acostumbrados a lidiar con bytes de 8 bits, pero el Estándar dice que hayn
bits en un byte.
Enesta publicaciónAlf P. Steinbach dice:
largo está garantizado (al menos) 32 bits.
Esto va en contra de todo lo que entiendo el tamaño de los tipos fundamentales para estar en C ++ de acuerdo con el Estándar. Normalmente, simplemente descartaría esta afirmación porque un principiante está equivocado, pero como era Alf, decidí que valía la pena investigar más.
Entonces, ¿qué dices? ¿El estándar garantiza por mucho tiempo que sea de al menos 32 bits? En caso afirmativo, especifique cómo se hace esta garantía. Simplemente no lo veo.
El estándar C ++ dice específicamente que para conocer C ++ debes conocer C (1.2 / 1)1
El estándar C ++ define implícitamente el límite mínimo de los valores along
puede acomodar serLONG_MIN
-LONG_MAX
2
Así que no importa cuán grande sealong
es decir, tiene que ser lo suficientemente grande como para contener LONG_MIN a LONG_MAX.
Pero Alf y otros sonespecífico que un largo debe ser de al menos 32 bits. Esto es lo que estoy tratando de establecer. El estándar C ++ es explícito que el número de bits en un byte no está especificado (podría ser 4, 8, 16, 42) Entonces, ¿cómo se hace la conexión para poder acomodar los números?LONG_MIN-LONG_MAX
a tener al menos 32 bits?
(1) 1.2 / 1: Los siguientes documentos de referencia son indispensables para la aplicación de este documento. Para las referencias con fecha, sólo se aplica la edición citada. Para referencias sin fecha, se aplica la última edición del documento referenciado (incluidas las enmiendas).
ISO / IEC 2382 (todas las partes), Tecnología de la información - VocabularioISO / IEC 9899: 1999, Lenguajes de programación - CISO / CEI 10646-1: 2000, Tecnología de la información - Juego de caracteres universal codificado con múltiples octetos (UCS) - Parte 1: Arquitectura y plano multilingüe básico(2) Definido en<climits>
como:
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 // 2^31 - 1