tipo - unsigned char c
¿Puedo suponer que el tamaño de int largo es siempre de 4 bytes? (9)
¿Es siempre cierto que
long int
(que hasta donde yo entiendo es sinónimo de
long
) es de
4
bytes?
¿Puedo confiar en eso? Si no, ¿podría ser cierto para un sistema operativo basado en POSIX?
Como señaló @delnan, las implementaciones POSIX mantienen el tamaño de
long
e
int
como no especificado y, a menudo, difiere entre sistemas de 32 bits y 64 bits.
La longitud de
long
está relacionada principalmente con el
hardware
(a menudo coincide con el tamaño de los registros de datos en la CPU y, a veces, otros problemas relacionados con el software, como el diseño del sistema operativo y la interfaz ABI).
Para tranquilizarlo,
sizeof
no es una función, sino una directiva de compilación *, por lo que su código no usa operaciones cuando usa
sizeof
: es lo mismo que escribir un número, solo es portátil.
utilizar:
sizeof(long int)
* Como Dave señaló en los comentarios,
sizeof
se calculará en tiempo de ejecución cuando sea imposible calcular el valor durante la compilación, como cuando se usan matrices de longitud variable.
Además, como se señaló en otro comentario,
sizeof
toma en consideración el relleno y la alineación utilizados por la implementación, lo que significa que los bytes reales en uso podrían ser diferentes al tamaño en la memoria (esto podría ser importante al cambiar de bit).
Si está buscando variables de tamaño de bytes específicas, considere usar una matriz de bytes o (supongo que es compatible) los tipos definidos por C99 en
stdint.h
, como lo sugiere @dbush.
Cuando implementamos por primera vez C en hardware ICL Series 39, tomamos el estándar en su palabra y mapeamos los tipos de datos a la representación natural en la arquitectura de esa máquina, que era
short
= 32 bits,
int
= 64 bits,
long
= 128 bits.
Pero descubrimos que no funcionaban aplicaciones C serias;
todos asumieron el mapeo
short
= 16,
int
= 32,
long
= 64, y tuvimos que cambiar el compilador para admitirlo.
Entonces, sea lo que sea que diga el estándar oficial, durante muchos años todos han convergido en
long
= 64 bits y no es probable que cambie.
Del blog de Usrmisc:
El estándar lo deja completamente en manos del compilador, lo que también significa que el mismo compilador puede hacer que dependa de las opciones y la arquitectura de destino.
Entonces no puedes.
Por cierto,
long int
es lo mismo que
long
.
El
estándar
no dice nada sobre el tamaño de
long int
, por lo que depende del entorno que esté utilizando.
Para obtener el tamaño de
long int
en su entorno, puede usar el operador
sizeof
y obtener el tamaño de
long int
.
Algo como
sizeof(long int)
El estándar C solo requiere los siguientes puntos sobre los tamaños de los tipos
- int> = 16 bits,
- largo> = 32 bits,
- largo largo (desde C99)> = 64 bits
- sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long) <= sizeof (long long)
- sizeof (char) == 1
- CHAR_BIT> = 8
El resto son implementaciones definidas, por lo que no sorprende que uno encuentre algunos sistemas en los que int tiene 18/24/36/60 bits, la forma firmada del complemento, sizeof (char) == sizeof (short) == sizeof (int) == sizeof (long) == 4, 48-bit de largo o 9-bit como arquitecturas exóticas que preocupan a los comités de estándares y Lista de plataformas soportadas por el estándar C
El punto sobre long int anterior está completamente equivocado. La mayoría de las implementaciones de Linux / Unix definen largo como un tipo de 64 bits, pero son solo 32 bits en Windows porque usan diferentes modelos de datos (eche un vistazo a la tabla aquí computación de 64 bits ), y esto es independientemente de 32 o 64 bits Versión del sistema operativo.
El compilador determina el tamaño según el tipo de hardware y sistema operativo.
Por lo tanto, no se deben hacer suposiciones con respecto al tamaño.
Los estándares no dicen nada con respecto al tamaño exacto de cualquier tipo de entero aparte de
char
.
Por lo general,
long
es de 32 bits en sistemas de 32 bits y 64 bits en sistemas de 64 bits.
Sin embargo, el estándar especifica un tamaño mínimo . De la sección 5.2.4.2.1 de la Norma C :
1 Los valores dados a continuación se reemplazarán por expresiones constantes adecuadas para su uso en
#if
directivas de preprocesamiento. Además, a excepción deCHAR_BIT
yMB_LEN_MAX
, lo siguiente se reemplazará por expresiones que tengan el mismo tipo que una expresión que es un objeto del tipo correspondiente convertido de acuerdo con 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, por ejemplo,
CHAR_BIT
igual a 16, un
long int
podría tener 2 bytes de longitud.
Aquí hay 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:
sizeof (largo) = 4
Salida en CentOS 7 x64:
sizeof (largo) = 8
Entonces 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 bits -
uint8_t
: sin signo de 8 bits -
int16_t
: firmado de 16 bits -
uint16_t
: sin signo de 16 bits -
int32_t
: firmado de 32 bits -
uint32_t
: sin firmar de 32 bits -
int64_t
: firmado de 64 bits -
uint64_t
: sin firmar de 64 bits
El encabezado
stdint.h
se describe en la sección 7.20 del estándar, con los tipos de ancho exactos 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 Unix de 64 bits
tienen una
long
64 bits (8 bytes).
Respuesta corta: ¡No!
No puede hacer suposiciones fijas sobre el tamaño de
long int
.
Porque, el estándar (estándar C o POSIX) no documenta el tamaño de
long int
(como se enfatiza repetidamente).
Solo para proporcionar un contraejemplo a su creencia, ¡la mayoría de los sistemas de 64 bits tienen
long
tamaño
long
de 64!
Para maximizar la portabilidad, use
sizeof
apropiadamente.
Use
sizeof(long int)
para verificar el tamaño, devuelve el tamaño de
long
en bytes.
El valor depende del sistema o del entorno;
es decir, el compilador determina el tamaño en función del hardware y el sistema operativo.
Use el código
sizeof(long int)
y verifique el tamaño.
Le dará el tamaño de int largo en bytes en el sistema que está trabajando actualmente.
La respuesta de su pregunta en particular es NO.
No está garantizado en C ni en POSIX ni en ningún otro lugar.