tipos tipo sirve rango que programacion para long enteros datos dato c linux types posix

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.

Source


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 de CHAR_BIT y MB_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.



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.