Corrígeme si estoy equivocado,
int es 4 bytes, con un rango de valores de -2,147,483,648 a 2,147,483,647 (2 ^ 31) de
largo es 4 bytes, con un rango de valores de -2,147,483,648 a 2,147,483,647 (2 ^ 31)
¿Cuál es la diferencia en C ++? ¿Pueden usarse indistintamente?
#include <stdint.h>
y luego los tipos que indican el tamaño. Ejuint32_t
. En una nueva plataforma, solo necesita asegurarse de que stdint.h lo haga bien para esa plataforma en particular y de que su código funcione según lo previsto.Respuestas:
Depende de la implementación.
Por ejemplo, en Windows son iguales, pero, por ejemplo, en los sistemas Alpha, una longitud era de 64 bits, mientras que una int era de 32 bits. Este artículo cubre las reglas para el compilador Intel C ++ en plataformas variables. Para resumir:
fuente
La única garantía que tienes son:
Consulte también: ¿Se
long
garantiza que sea de al menos 32 bits?fuente
Al compilar para x64, la diferencia entre int y long está entre 0 y 4 bytes, dependiendo del compilador que use.
GCC usa el modelo LP64, lo que significa que los ints son de 32 bits, pero los longs son de 64 bits en el modo de 64 bits.
MSVC, por ejemplo, usa el modelo LLP64, lo que significa que tanto los ints como los longs son de 32 bits incluso en el modo de 64 bits.
fuente
La especificación de C ++ en sí (versión antigua pero lo suficientemente buena para esto) deja esto abierto.
fuente
Como señala Kevin Haines, los ints tienen el tamaño natural sugerido por el entorno de ejecución, que debe encajar en INT_MIN e INT_MAX.
El estándar C89 establece que
UINT_MAX
debería ser al menos 2 ^ 16-1,USHRT_MAX
2 ^ 16-1 yULONG_MAX
2 ^ 32-1. Eso hace un recuento de bits de al menos 16 para short e int, y 32 para long. Para char, establece explícitamente que debe tener al menos 8 bits (CHAR_BIT
). C ++ hereda esas reglas para el archivo limits.h, por lo que en C ++ tenemos los mismos requisitos fundamentales para esos valores. Sin embargo, no debe deducirse que int es al menos de 2 bytes. Teóricamente, char, int y long podrían ser todos de 1 byte, en cuyo casoCHAR_BIT
debe ser al menos 32. Solo recuerde que "byte" es siempre del tamaño de un char, por lo que si char es más grande, un byte no solo tiene 8 bits. más.fuente
byte
existiera un tipo de datos en C ++. No es así, ¿verdad? Si lo hace, ybyte
puede tener otros tamaños que 8 bits, es puramente estúpido. ¿Por qué lo llamarían byte a menos que sea absolutamente necesariamente de 8 bits?Depende de tu compilador. Se le garantiza que un long será al menos tan grande como un int, pero no se le garantiza que lo sea más.
fuente
En su mayor parte, el número de bytes y el rango de valores está determinado por la arquitectura de la CPU, no por C ++. Sin embargo, C ++ establece requisitos mínimos, que litb explicó correctamente y Martin York solo cometió algunos errores con.
La razón por la que no puede usar int y long indistintamente es porque no siempre tienen la misma longitud. C se inventó en un PDP-11 donde un byte tenía 8 bits, int tenía dos bytes y podía manejarse directamente mediante instrucciones de hardware. Dado que los programadores de C a menudo necesitaban aritmética de cuatro bytes, se inventó long y eran cuatro bytes, manejados por funciones de biblioteca. Otras máquinas tenían especificaciones diferentes. El estándar C impuso algunos requisitos mínimos.
fuente
Depender de la implementación del proveedor del compilador de tamaños de tipo primitivos VOLVERÁ a atormentarlo si alguna vez compila su código en otra arquitectura de máquina, sistema operativo o compilador de otro proveedor.
La mayoría de los proveedores de compiladores proporcionan un archivo de encabezado que define tipos primitivos con tamaños de tipo explícitos. Estos tipos primitivos deben usarse siempre que el código pueda potencialmente ser portado a otro compilador (lea esto como SIEMPRE en CADA instancia). Por ejemplo, la mayoría de los compiladores de UNIX tienen
int8_t uint8_t int16_t int32_t uint32_t
. Microsoft tieneINT8 UINT8 INT16 UINT16 INT32 UINT32
. Prefiero el de Borland / CodeGearint8 uint8 int16 uint16 int32 uint32
. Estos nombres también dan un pequeño recordatorio del tamaño / rango del valor deseado.Durante años he usado los nombres de tipos primitivos explícitos de Borland y
#include
el siguiente archivo de encabezado C / C ++ (primitive.h) que está destinado a definir los tipos primitivos explícitos con estos nombres para cualquier compilador C / C ++ (este archivo de encabezado podría no cubrir todos los compilador pero cubre varios compiladores que he usado en Windows, UNIX y Linux, tampoco (todavía) define tipos de 64 bits).fuente
El estándar C ++ dice así:
3.9.1, §2:
La conclusión: depende de la arquitectura en la que esté trabajando. Cualquier otra suposición es falsa.
fuente