¿Puedo asumir que el tamaño de long int es siempre de 4 bytes?


Es siempre cierto que long int (que entiendo que es un sinónimo de long) es 4 bytes?

¿puedo confiar en eso? Si no, ¿podría ser cierto para un sistema operativo basado en POSIX?

Author: dbush, 2016-03-07

9 answers

Los estándares no dicen nada con respecto al tamaño exacto de cualquier tipo entero aparte de char. Normalmente, long es de 32 bits en sistemas de 32 bits y de 64 bits en sistemas de 64 bits.

Sin embargo, la norma 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 sustituyen por expresiones constantes apto para ser utilizado en las directivas de preprocesamiento #if. Además, excepto CHAR_BIT y MB_LEN_MAX, los siguientes serán reemplazado por expresiones que tienen el mismo tipo que un expresión que es un objeto del tipo correspondiente convertido de acuerdo con las promociones de enteros. Su implementación-definida los valores 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 ser un mínimo de 32 bits, pero puede ser mayor. En una máquina donde CHAR_BIT es 8, esto da un tamaño mínimo de bytes 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 largo.

Aquí hay un ejemplo del mundo real. Para lo siguiente código:

#include <stdio.h>

int main ()
{
    printf("sizeof(long) = %zu\n", sizeof(long));
    return 0;
}

Salida en Debian 7 i686:

Sizeof(long) = 4

Salida en CentOS 7 x64:

Sizeof(long) = 8

Así que no, no se puede hacer ninguna suposición 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 8-bit
  • uint8_t: unsigned 8-bit
  • int16_t: firmado 16-bit
  • uint16_t: sin firmar 16-bit
  • int32_t: firmado 32-bit
  • uint32_t: unsigned 32-bit
  • int64_t: firmado 64-bit
  • uint64_t: unsigned 64-bit

La cabecera stdint.h se describe en la sección 7.20 de la norma, con los tipos de anchura exacta 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.

 104
Author: dbush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-03 16:46:53

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 64 bits (8 bytes) long.

 38
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-07 13:12:46

Utilice el código sizeof(long int) y compruebe el tamaño. Le dará el tamaño de long int en bytes en el sistema que está trabajando actualmente. La respuesta de su pregunta en particular es NO. No está garantizado en ninguna parte en C o en POSIX o en cualquier lugar.

 20
Author: Kevin Pandya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-16 12:35:18

Como señaló @delnan, las implementaciones POSIX mantienen el tamaño de long y int como no especificado y a menudo difiere entre sistemas de 32 y 64 bits.

La longitud de long está principalmente relacionada con 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 facilitar su mente, sizeof no es una función, sino una directiva de compilador*, por lo que su código no está utilizando operaciones al usar sizeof - es lo mismo que escribir un número, solo que es portátil.

Uso:

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.

También, como se señaló en otro comentario, sizeof tiene en cuenta 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 memoria (esto podría ser importante cuando bit shifting).

Si está buscando variables de tamaño de byte específicas, considere usar una matriz de bytes o (asumiría que es compatible) los tipos definidos por C99 en stdint.h, como sugiere @dbush.

 14
Author: Myst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-08 08:33:13

Cuando implementamos por primera vez C en el hardware de la serie 39 de ICL, tomamos el estándar en su palabra y asignamos los tipos de datos a la representación natural en esa arquitectura de máquina, que era short = 32 bits, int = 64 bits, long = 128 bits.

Pero encontramos que ninguna aplicación seria de C funcionó; todos asumieron la asignación short = 16, int = 32, long = 64, y tuvimos que cambiar el compilador para soportar eso.

Así que lo que dice el estándar oficial, durante muchos años todos ha convergido en long = 64 bits y no es probable que cambie.

 13
Author: Michael Kay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-17 03:49:55

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 utilizar el sizeof operador y obtener el tamaño de long int. Algo así como

sizeof(long int)

C standard solo requiere los siguientes puntos sobre los tamaños de los tipos

  • int > = 16 bits,
  • long > = 32 bits,
  • long long (desde C99) > = 64 bits
  • sizeof (char)
  • sizeof (char) = = 1
  • CHAR_BIT > = 8

El resto son implementaciones definidas, por lo que no es de extrañar si uno encontró algunos sistemas donde int tiene 18/24/36/60 bits, uno complement signed form, sizeof (char) = = sizeof (short) = = sizeof (int) == sizeof(long) = = 4, 48-bit long o 9-bit char como arquitecturas exóticas de las que se preocupan los comités de estándares y la Lista de plataformas soportadas por el estándar C

El punto sobre long int anterior está completamente equivocado. La mayoría de Linux / Unix las implementaciones definen long como un tipo de 64 bits, pero solo tiene 32 bits Windows, ya que utilizan diferentes modelos de datos (echar un vistazo a la tabla aquí 64-bit computing), y esto es independientemente de 32 o 64 bits Versión del sistema operativo.

Fuente

 10
Author: Rahul Tripathi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-25 20:48:02

El compilador determina el tamaño en función del tipo de hardware y sistema operativo.

Por lo tanto, no se deben hacer suposiciones con respecto al tamaño.

 8
Author: Karthik Balaguru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-20 20:42:06

De El 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.

Así que no puedes.

Incidentalmente long int es lo mismo que long.

 1
Author: simhumileco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-20 13:06:15

Respuesta corta: ¡No! No se pueden hacer suposiciones fijas sobre el tamaño de long int. Porque, el estándar (C standard o POSIX) no documenta el tamaño de long int (como se enfatiza repetidamente). Solo para proporcionar un ejemplo contrario a su creencia, la mayoría de los sistemas de 64 bits tienen long de tamaño 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 basado en el hardware y el sistema operativo.

 0
Author: Ehsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-22 14:37:48