Что определяет размер типа? - PullRequest
5 голосов
/ 15 мая 2019

Стандарт ISO C гласит, что:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

Я использую GCC-8 на BIT Linux mint (19.1), а размер long int равен 8.

Я использую приложение, которое использует GCC 7, а компилятор 64-битный. Размер long int составляет 4. Компилятор или операционная система определяет размер long int?

Ответы [ 4 ]

6 голосов
/ 15 мая 2019

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

При этом, как правило, компилятор создает исполняемый файл, который может использовать операционная система, поэтому здесь есть некоторая взаимосвязь. Поскольку такие вещи, как размер int, на самом деле не имеют значения , пока они согласованы , вы увидите вариацию.

Другими словами, если ядро ​​ожидает, что long int будет 8 байтов из-за того, как оно было скомпилировано, то вы захотите скомпилировать этот путь, чтобы соответствовать, или ваш скомпилированный код не будет совпадать, и ни одна из разделяемых библиотек будет работать.

4 голосов
/ 15 мая 2019

Двоичный интерфейс приложения для операционной системы / архитектуры определяет размеры основных типов:

Детали покрытия ABI, такие как (шахтный шрифт):

  • набор команд процессора (с такими деталями, как структура файла регистра, организация стека, типы доступа к памяти, ...)
  • размеры, схемы и выравнивания основных типов данных, которые процессор используетможет напрямую обращаться к
  • соглашению о вызовах, которое управляет передачей аргументов функций и получением возвращаемых значений;например, все ли параметры передаются в стеке или некоторые из них передаются в регистрах, какие регистры используются для каких параметров функции, и передается ли первый или последний параметр функции в стек в стек
  • как приложение должно выполнять системные вызовы операционной системы и, если ABI определяет прямые системные вызовы, а не вызовы процедур для заглушек системных вызовов, номера системных вызовов
  • и в случае полной операционной системы ABI, двоичный формат объектных файлов, программных библиотек и т. д.
3 голосов
/ 15 мая 2019

Это оставлено на усмотрение реализации.

Это реализация (компилятор и стандартная библиотека), которая определяет размер long, int и всех другихтипы.

Пока они соответствуют ограничениям, заданным стандартом, реализация может принимать все решения относительно размеров типов (возможно, за исключением указателей).

2 голосов
/ 16 мая 2019

TL / DR - точный размер компилятора.


Стандарт требует, чтобы тип мог представлять минимальный диапазон значений - например, unsigned char должен иметь возможность представлять как минимум диапазон [0..255], int должен иметь возможность представлять как минимум диапазон [-32767...32767]и т. д.

Этот минимальный диапазон определяет минимальное количество битов - вам необходимо не менее 16 бит для представления диапазона [-32767..32767] (некоторые системы могут использовать биты заполнения или биты четности, которыечасть слова, но не используется для представления значения).

В игру вступают и другие архитектурные соображения - int - это , обычно , равный размеру собственного слова.Таким образом, в 16-битной системе int будет (обычно) 16 битами, а в 32-битной - 32 бита.Так что, в конечном итоге, дело доходит до компилятора.

Однако в 32-разрядной системе можно использовать один 16-разрядный int, а другой - 32-разрядный int.Это привело к потере времени в середине 90-х, когда я написал некоторый код, который предполагал 32-битный int, который прекрасно работал под одним компилятором, но сломал мир под другим компилятором на том жеаппаратное обеспечение.

Итак, извлеченный урок - никогда не предполагает , что тип может представлять значения за пределами минимума , гарантированного Стандартом.Либо проверьте содержимое limits.h и float.h, чтобы определить, достаточно ли велик тип, либо используйте один из типоразмеров типа stdint.h (int32_t, uint8_t и т. Д.).

...