Los estándares no dicen nada sobre el tamaño exacto de cualquier tipo de entero además de char
. Normalmente, long
es de 32 bits en sistemas de 32 bits y de 64 bits en sistemas de 64 bits.
Sin embargo, el estándar especifica un mínimo Talla. De la sección 5.2.4.2.1 del Estándar C:
1 Los valores dados a continuación serán reemplazados por expresiones constantes adecuadas para usar en #if
directivas de preprocesamiento. Además, a excepción de CHAR_BIT
y MB_LEN_MAX
, lo siguiente se reemplazará por expresiones que tengan el mismo tipo que tendría una expresión que es un objeto del tipo correspondiente convertido según las promociones de enteros. Sus valores definidos por la implementación serán iguales o mayores en magnitud (valor absoluto) a los mostrados, con el mismo signo.
...
-
valor mínimo para un objeto de tipo
long int
LONG_MIN
-2147483647 // −(2^31−1) -
valor máximo para un objeto de tipo
long int
LONG_MAX
+2147483647 // 2^31−1
Esto dice que un long int
debe tener un mínimo de 32 bits, pero puede ser mayor. En una máquina donde CHAR_BIT
es 8, esto da un tamaño de byte mínimo de 4. Sin embargo, en una máquina con, p. CHAR_BIT
igual a 16, un long int
podría tener 2 bytes de longitud.
He aquí un ejemplo del mundo real. Para el siguiente código:
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Salida en Debian 7 i686:
tamaño de (largo) =4
Salida en CentOS 7 x64:
tamaño de (largo) =8
Así que no, no puedes hacer suposiciones sobre el tamaño. Si necesita un tipo de un tamaño específico, puede usar los tipos definidos en stdint.h
. Define los siguientes tipos:
int8_t
:firmado de 8 bitsuint8_t
:8 bits sin firmarint16_t
:firmado de 16 bitsuint16_t
:16 bits sin firmarint32_t
:firmado de 32 bitsuint32_t
:32 bits sin firmarint64_t
:firmado de 64 bitsuint64_t
:64 bits sin firmar
El stdint.h
el encabezado se describe en la sección 7.20 del estándar, con tipos de ancho exacto en la sección 7.20.1.1. El estándar establece que estos typedefs son opcionales, pero existen en la mayoría de las implementaciones.
No, ni el estándar C ni POSIX garantizan esto y, de hecho, la mayoría de las plataformas de 64 bits similares a Unix tienen un long
de 64 bits (8 bytes). .