Размер типов данных в C зависит от ОС? - PullRequest
3 голосов
/ 23 марта 2011

Например, int занимает 4 байта в 32-битной ОС, но 8 байтов в 64-битной ОС, существует ли такая вещь в C?

Ответы [ 3 ]

6 голосов
/ 23 марта 2011

Да. Это именно то, что подразумевается под «специфичными для платформы определениями» для таких вещей, как размер int и значение системных вызовов.

Они зависят не только от ОС, но и от целевого оборудования и конфигурации компилятора.

2 голосов
/ 23 марта 2011

Это может зависеть от ОС, но чаще это зависит от аппаратного обеспечения. Многие микроконтроллеры все еще используют 16-битные int: s, поскольку это то, что устройство обрабатывает естественным образом.

Пока мы в теме. Это влияет не только на тип int, но и на оценку выражений. Принцип заключается в том, что каждое выражение оценивается так, как если бы оно было оценено с точностью int или больше. Например, если заданы две 16-разрядные short переменные a и b и long переменная x, выражение x = a*b даст различный результат в зависимости от размера int, хотя ни одна из них из задействованных переменных имеют тип int.

2 голосов
/ 23 марта 2011

Размеры типов данных 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 году. Они сделали это, чтобы помочь в переходе, обеспечить переносимость и совместимость и максимизировать производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...