Спецификации типов intи unsigned intшироко используются в программах на Си, поскольку они позволяют наиболее эффективно работать с целыми значениями на данном компьютере. Однако, поскольку размер типов intи unsigned intявляется машинно-зависимым, программы, зависящие от конкретного размера типа intили unsigned intна каком-либо компьютере, могут быть непереносимы на другой компьютер. Переносимость программ можно повысить, если использовать для ссылки на размер типа данных операцию sizeof.
Порядок размещения байтов в памяти для базовых целых типов следующий (по возрастанию адресов):
для типа short— b0, b1;
для типа long— b0, b1, b2, b3,
где b0—младший байт.
Архитектура процессора Intel 8086/88 позволяет размещать переменные различного размера в памяти, как с четного, так и с нечетного адреса. Однако в последнем случае обращение к переменным будет более медленным. В СП TC существует опция компиляции, задающая выравнивание всех объектов, занимающих более одного байта, на границу четного адреса. Память при этом будет использоваться менее эффективно, но скорость обращения к переменным возрастет. В СП MSC по умолчанию производится выравнивание на границу четного адреса. В версии 5.0 СП MSC существует опция компиляции, обеспечивающая выравнивание на границу, заданную программистом. Вопросы выравнивания структур рассматриваются в разделе 3.4.3.
Согласно правилам преобразования типов в языке Си (см. раздел 5 "Выражения"), не всегда возможно использовать в выражении максимальное или минимальное значение для константы данного типа.
Допустим, требуется использовать в выражении значение -32768 типа short. Константное выражение -32768 состоит из арифметической операции отрицания (-), предшествующей значению константы 32768. Поскольку значение 32768 слишком велико для типа short, компилятор языка Си представляет его типом longи, следовательно, константа -32768 будет иметь тип long. Значение -32768 может быть представлено типом shortтолько путем явного приведения его к типу shortс помощью выражения ( short) (‑32768). Информация при этом не будет потеряна, поскольку значение -32768 может быть представлено двумя байтами памяти.
Восьмеричные и шестнадцатеричные константы могут иметь знаковый или беззнаковый тип, в зависимости от их значения (см. раздел 1.2.1). Однако метод присвоения компилятором языка Си типов восьмеричным и шестнадцатеричным константам гарантирует, что в выражениях они будут вести себя как беззнаковые целые (поскольку их знаковый бит всегда равен нулю).
СП ТС позволяет явно присваивать константам беззнаковый тип с помощью суффикса u.
Для представления значений с плавающей точкой используется стандартный формат IEEE (Institute of Electrical and Electronics Engineers, Inc.). Значения типа floatзанимают 4 байта, состоящих из бита знака, 7-битовой двоичной экспоненты и 24-битовой мантиссы. Мантисса представляет число в интервале от 1.0 до 2.0. Поскольку старший бит мантиссы всегда равен единице, он не хранится в памяти. Это представление дает область значений приблизительно от 3.4Е-38 до 3.4Е+38.
Значения типа doubleзанимают 8 байтов. Их формат аналогичен формату float, за исключением того, что экспонента занимает 11 битов, а мантисса 52 бита плюс неявный старший бит, единичный. Это дает область значений приблизительно от 1.7Е-308 до 1.7Е+308.
Значения типа long doubleзанимают 80 битов; их область значений—от 3.4Е-4932 до 1.1Е+4932. Формат их аналогичен формату double, однако, мантисса длиннее на 16 битов.
Синтаксис описателей рекурсивными правилами:
< идентификатор >
< описатель >[]
< описатель > [< константное-выражение >]
* < описатель >
< описатель >()
< описатель >( < список типов аргументов >)
( < описатель >)
Описатели в языке Си позволяют объявить следующие объекты: простые переменные, массивы, указатели и функции. В простейшем случае, если объявляется простая переменная базового типа, либо структура, либо объединение, описатель представляет собой идентификатор. При этом объекту присваивается тип, заданный спецификацией типа.
Читать дальше