Размеры типов данных C зависят от модели памяти, реализованной компилятором.Подумайте с точки зрения ILP (Int, Long, Pointer) и количества битов, используемых для указанных.
Таким образом, для компиляторов, использующих модель данных ILP64, значения Int, Long и Pointer будут равны 64 битам.Но модель данных LP64 будет иметь значение Int, установленное на 32 бита, а значение Long и Pointer - на 64 бита.
Авторы компиляторов попытаются использовать модель данных, которая лучше всего соответствует целевой платформе.Но также нужно учитывать сложность переноса библиотек и компиляции исходного кода, предназначенного для другой модели данных.
Вы можете легко увидеть, какую модель данных вы используете, с помощью следующего:
#include <stdio.h>
#define BYTE_SIZE 8
void main(void)
{
int sizeof_int = sizeof(int) * BYTE_SIZE;
int sizeof_long = sizeof(long) * BYTE_SIZE;
int sizeof_ptr = sizeof(&sizeof_int) * BYTE_SIZE;
printf("Size of int: %d, long: %d, pointer: %d\n",
sizeof_int, sizeof_long, sizeof_ptr );
}
На моем 64-битном процессоре AMD Pc, работающем под управлением 64-битного Debian Squeeze, это показывает, что GCC использует и модель данных LP64.Эта модель данных является наиболее распространенной 64-битной моделью данных, поскольку было решено стандартизировать ее с помощью ряда основных поставщиков UNIX в 1995 году. Они сделали это, чтобы помочь в переходе, обеспечить переносимость и совместимость и максимизировать производительность.