En los lenguajes de programación C y C++, el tamaño de los tipos de datos primitivos no está estrictamente definido por el estándar, sino que depende del modelo de datos y de la arquitectura del procesador objetivo. Una de las diferencias más notables entre las arquitecturas de 32 bits y 64 bits en sistemas tipo Unix (como Linux) es el tamaño en memoria del tipo long.
Modelos de datos: ILP32 vs LP64
En una arquitectura de 32 bits (modelo de datos ILP32), los tipos int, long y los punteros tienen un tamaño de 32 bits (4 bytes). Por otro lado, en arquitecturas de 64 bits bajo Linux (modelo de datos LP64), el tipo int mantiene su tamaño de 32 bits, pero long y los punteros se expanden a 64 bits (8 bytes).
Código de prueba
A continuación, se presenta un programa en C diseñado para inspeccionar el tamaño en memoria de los tipos enteros básicos y los punteros. Este código utiliza el operador sizeof y almacena los resultados en variables de tipo size_t para una impresión segura y portable.
#include <stdio.h>
#include <stdint.h>
int main(void) {
size_t int_bytes = sizeof(int);
size_t long_bytes = sizeof(long);
size_t ptr_bytes = sizeof(void*);
printf("=== Data Type Memory Allocation ===\n");
printf("int: %zu bytes\n", int_bytes);
printf("long: %zu bytes\n", long_bytes);
printf("pointer: %zu bytes\n", ptr_bytes);
return 0;
}
Resultados en entorno de 32 bits (x86)
Al compilar y ejecutar este código en un sistema operativo de 32 bits sobre un procesador como el Intel Atom N270, la salida refleja el modelo ILP32. La información relevante del procesador extraída de /proc/cpuinfo muestra direcciones físicas y virtuales limitaads a 32 bits.
processor : 0
model name : Intel(R) Atom(TM) CPU N270 @ 1.60GHz
address sizes : 32 bits physical, 32 bits virtual
La salida del programa en este entorno de 32 bits es la siguiente:
=== Data Type Memory Allocation ===
int: 4 bytes
long: 4 bytes
pointer: 4 bytes
Resultados en entorno de 64 bits (x86_64)
Cuando el mismo código se compila y ejecuta en un sistema de 64 bits, por ejemplo, en un procesador Intel Atom D525 con soporte para instrucciones de 64 bits, el modelo de datos cambia a LP64. El registro del sistema indica tamaños de dirección virtual de 48 bits, característicos de esta arquitectura.
processor : 0
model name : Intel(R) Atom(TM) CPU D525 @ 1.80GHz
address sizes : 36 bits physical, 48 bits virtual
La salida del programa en este entorno de 64 bits demuestra la expansión del tipo long y de los putneros:
=== Data Type Memory Allocation ===
int: 4 bytes
long: 8 bytes
pointer: 8 bytes
Implicaciones para el desarrollo de software
Esta discrepancia en el tamaño de long es una fuente común de errores de portabilidad y desbordamiento de búfer. Los desarrolladores deben evitar asumir que long siempre tendrá 8 bytes, especialmente si el código debe ser compilado tanto para plataformas de 32 como de 64 bits. Para garantizar tamaños exactos y predecibles en la asignación de memoria, se recomienda encarecidamente el uso de tipos de ancho fijo definidos en la cabecera <stdint.h>, como int32_t o int64_t.