Что определяет размер примитивных типов данных?

Для одного из моих назначений программирования на С++, я должен рассмотреть размер целочисленной переменной при разработке программы. Я читаю по интернету, и в большинстве мест говорится: "Размер целого зависит от платформы". Я не понимаю, что это значит, поэтому я прошу здесь.

  • Что определяет размер примитивного типа данных?

    • архитектура процессора (может быть размером набора инструкций).
    • Операционная система
    • Compiler
    • Сочетание выше.
  • В чем причина выбора целого числа с размером 2 byte в некоторых системах и 4 byte в других? Есть ли причина, по которой он больше не может работать с 2 байтами?

Ответ 1

Что определяет размер примитивного типа данных?

Это зависит от компилятора. Компилятор по очереди обычно зависит от архитектуры, процессора, среды разработки и т.д., Потому что он учитывает их. Поэтому вы можете сказать, что это комбинация всех.

В чем причина выбора целого числа с размером 2 байта в некоторых системах и 4 байта в других? Есть ли причина, по которой он больше не может работать с 2 байтами?

В стандарте С++ не указывается размер интегральных типов в байтах, но он указывает минимальные диапазоны, которые они должны удержать. Вы можете вывести минимальный размер в битах из требуемого диапазона. Вы можете вывести минимальный размер в байтах из этого и значение макроса CHAR_BIT, которое определяет количество бит в байте (во всех, кроме самых неясных платформах, это 8, и оно не может быть меньше 8).

Ознакомьтесь с здесь для получения дополнительной информации.

Ответ 2

Какая платформа здесь означает.

Обычно это означает комбинацию операционной системы, компилятора и некоторых специальных опций компилятора.

какая причина для выбора размеров примитивных типов данных.

Это будет "Комбинация выше".


Кстати, это называется "модель памяти" или "модель данных" (не уверен, какой из них является правильным термином), вы можете узнать больше об этом из http://en.wikipedia.org/wiki/64-bit

Ответ 3

Кажется, на ваш первый вопрос уже был дан ответ, поэтому я возьму второй удар:

В чем причина выбора целого числа с размером 2 байта в некоторых системах и 4 байта в других? Есть ли причина, по которой он больше не может работать с 2 байтами?

Это сводится к мнениям разработчиков архитектуры (или компилятора и т.д.). Очень часто адреса памяти представлены как типы данных unsigned integer. Таким образом, вы получаете эту интересную историю размеров integer, которые отражают размер адреса в операционной системе. То есть, это не случайно, что:

cout << "Unsigned short: " << sizeof(unsigned short) << endl;
cout << "Unsigned int: " << sizeof(unsigned int) << endl;
cout << "Unsigned long: " << sizeof(unsigned long) << endl;

Производит следующий вывод для большинства систем:

Unsigned short: 2
Unsigned int: 4
Unsigned long: 8

Поскольку байт имеет 8 бит, вы получаете следующие размеры:

  • Unsigned short: 16-bit
  • Unsigned int: 32-разрядный
  • Unsigned long: 64-разрядный

Вы можете сделать хорошую ставку, что если мы доберемся до 128-битных операционных систем, появится тип данных (возможно, unsigned long long?), который состоит из 16 байтов.

Итак, это история в некотором смысле, но зачем начинать архитектор с этих размеров? Ну, несколько причин:

  • "Это достаточно важно". Ученые компьютеров любят делать только столько, сколько им нужно, поэтому тип данных integer, какой-либо более крупный, скорее всего, будет расточительным в большинстве случаев использования, потому что людям просто не нужно считать, что высокий с примитивным типом данных.
  • "Он настолько большой, насколько мы можем получить". Вы хотите, чтобы integer полностью помещался в один регистр, поэтому размер обычно ограничен аппаратным обеспечением (регистры являются только одним примером).

Я уверен, что есть другие причины, по которым более умные и опытные участники StackOverflow могут дать: -)

Ответ 4

В C размер int равен 4 байтам в gcc (сборник компиляторов GNU) и 2 байта в компиляторе borland и turbo c. Последние два компилятора предназначены для Windows, а gcc-компилятор - это компилятор для ОС Linux. Размер примитивных типов данных основан на компиляторе, и этот компилятор в основном специфичен для конкретной ОС. Я лично предпочитал компилятор gcc для других компиляторов, потому что он поддерживает множество функций в соответствии с определением языка C. Один из примеров - нулевой указатель. Если вы объявляете нулевой указатель в gcc и пытаетесь получить к нему доступ в gcc, он дает вам ошибку, но turbo c позволяет использовать его без ошибок.