4.1.3. Типы данных

(Руководство разработчика по микроконтроллерам семейства HCS08)

В языке C существует 3 основных типа данных: целочисленные integer, с плавающей запятой float и специальный тип для спецификации пустых значений void. Целочисленные данные могут быть представлены как в формате со знаком signed, так и без знака unsigned. В последнем случае значения переменной могут быть только положительными. Числа с плавающей запятой типа float могут быть как целыми, так и дробными. Тип данных void преимущественно используется для объявления функций, которые не используют входных переменных для своей работы и не возвращают каких-либо значений.

Язык программирования C поддерживает несколько модификаторов типа данных:

shortдля сужения диапазона чисел;
longдля расширения диапазона чисел;
signedдля определения знаковых переменных;
unsignedдля определения переменных без знака.

В соответствии со стандартом ANSI все типы данных по умолчанию считаются знаковыми, т.е. signed. Для того чтобы выбранный тип данных, например 16-битный integer, использовался в формате без знака, перед определением типа данных необходимо применить модификатор unsigned, т.е. записать unsigned integer. Исключением из этого правила является тип данных char. Переменные типа char по умолчанию могут принимать только положительные значения, т.е. по умолчанию имеют модификатор unsigned. Список возможных типов данных языка C по стандарту ANSI представлен в Табл.4.2.

Таблица4.2. Типы данных языка C

Тип данныхДиапазон значенийРазмер памяти в байтах
unsigned char, char0...2551
signed char–128...+1271
unsigned int, unsigned short int0...655352
int, signed int, short int, signed short int–32768...+327672
unsigned long int0...42949672954
long int, signed long int–2147483648...+21474836474
float1.18×10–38...3.4×10384
double*1.18×10–38...3.4×1038 или
2.23×10–308...1.8×10308
4 или 8
long double*1.18×10–38...3.4×1038 или
2.23×10–308...1.8×10308
4 или 8

* Компилятор CodeWarrior позволяет выбрать формат в 4 или 8 байт.

Первые 6 типов данных, описанных в Табл.4.2, — целочисленные, последние 3 типа — числа с плавающей запятой, в которых для представления мантиссы используются дробные числа.

4.1.3.1. Объявление переменных

Переменные в языке C должны быть объявлены до того, как они будут использованы в тексте программного кода. Объявить переменную можно или в начале программы или в начале блока кода функции.

В зависимости от места, где объявлена переменная, определяется видимость переменной и время ее жизни. Совокупность этих параметров определяет область действия переменной:

  • Если переменная определена за пределами тела функции, т.е. в начале программы, то она имеет глобальную область действия. К этой переменной можно обратиться из любой функции и просмотреть ее содержимое в любом месте программы. Время жизни переменной равно времени выполнения программы. Такие переменные называются глобальными, поскольку они имеют глобальную область действия.
  • Если же переменная была определена в теле функции, то она имеет локальную область действия. Такая переменная может быть просмотрена и изменена только в пределах функции, где была объявлена. Время жизни локальных переменных равно времени работы функции.

Объявление переменной имеет следующий формат:

Спецификатортипа<списокименпеременных,разделенныйзапятыми>

Для определения переменной поддерживается любой спецификатор типа из списка, указанного в Табл.4.2. Имя переменной — это ее название, которое будет использоваться в выражениях и операциях. Примеры объявления переменных:

Inttest;//Объявлениезнаковойцелочисленнойпеременнойтипаint
unsignedintmy_var;//Беззнаковаяцелочисленнаяпеременнаятипаint
charfirst,second;//Двеположительныеоднобайтныезнаковыепеременные
float_result;//Объявлениедробнойпеременной_result;

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

  1. Имена должны содержать только буквы, цифры и символ подчеркивания. Все остальные символы, включая пробел, запрещены.
  2. Имена должны начинаться с буквы или знака подчеркивания.
  3. Максимальная длина имени функции не должна превышать 31 символа.
  4. В именах имеет значение регистр символов, т.е. переменные TEST и Test считаются разными.
  5. Нельзя использовать ключевые слова языка C в качестве имен переменных.

4.1.3.2. Инициализация переменных

В языке C есть возможность инициализировать переменные сразу во время их объявления. Это можно сделать, дописав начальное значение в выражение объявления:

charvl;//Объявлениепеременнойv1
charv2=10;//Объявлениепеременнойv2иприсвоениеначальногозначения10

Для инициализации переменных можно использовать шестнадцатеричные и восмеричные числа:

charv3=0x10;//Переменнаяv3сначальнымзначением16вдесятичнойсистемесчисления
charv4=010;//Переменнаяv4сначальнымзначением8вдесятичнойсистемесчисления

Также можно использовать символы для инициализации переменной:

charv5='A';//Инициализацияпеременнойv5значением'A'
//Реальноезначениеv5=65—этоASCII-коддлясимвола«A»

Наконец, переменную можно инициализировать строкой:

charstr[]={"Astringconstant"};

В данном случае компилятор автоматически зарезервирует необходимое количество байтов в памяти, чтобы записать всю строку и завершающий символ (в языке C все строки заканчиваются символом 0x00).

В случае, если в строку необходимо записать один из неотображаемых символов, например Backspace, следует использовать символ «/». В Табл.4.3 приведены управляющие последовательности с символом «/» для ввода некоторых неотображаемых символов и производства некоторых действий при компиляции.

Таблица4.3. Управляющие последовательности для ввода неотображаемых символов

СимволОписание
/bBackspace (ASCII BS)
/fНовая страница (ASCII FF)
/nНовая строка (ASCII LF)
/rВозврат каретки (ASCII CR)
/“Перевернутые “
/’Апостроф ’
/0Ноль
//Инвертирование строки
/NВосьмеричная константа
/xNШестандцатеричная константа

Далее приведены две строки программного кода, в которых использются управляющие последовательности.

charstr1[]={"Invertedbar://"};//Вставляетпроинвертированнуюстрокупосле:
charstr2[]={"test/0x20TEST"};//ВставляетпробелмеждуtestиTEST

4.1.3.3. Спецификаторы класса памяти

В дополнение к спецификатору типа данных в языке C существуют спецификаторы классов памяти. Спецификатор определяет порядок размещения переменой в памяти. Выделяют следующие спецификаторы:

autoавтоматически определяет положение переменной в памяти. Такой класс хранения используется для локальных переменных. Ранее было отмечено, что локальная переменная может потерять свое значение, если исполняемый программный код уже вышел за пределы функции или блока, в котором эта переменная была объявлена. Спецификатор auto в настоящее время не используется стандартом ANSI, по умолчанию все локальные переменные имеют класс хранения auto.
constопределяет константу, т.е. такую переменную, значение которой не может быть изменено программой в ходе ее выполнения. Обычно константы хранятся в энергонезависимой флэш-памяти.
externопределяет глобальную переменную, которая была объявлена вне программы, т.е. в другом модуле, который был подключен к рассматриваемому модулю.
registerпеременные данного класса хранения по возможности записываются не в память ОЗУ, а в регистры общего назначения ЦП. Обычно это ускоряет работу программы, но для устройств HCS08 данный класс практически бесполезен из-за малого количества регистров общего назначения в ЦП.
staticопределяет переменную, время жизни которой равно времени работы программы. Статические переменные могут быть как глобальными, так и локальными. Локальные статические переменные не уничтожаются после выхода из функции, в которой они были объявлены. Локальные статические переменные сохраняют свое значение между обращениями к функции. Такие переменные можно интерпретировать как глобальные переменные, но с ограниченной видимостью. А глобальные статические переменные можно представить как глобальные, но с побочным эффектом невидимости во внешних классах по отношению к родительскому, т.е. к тому, где была объявлена переменная. Статические переменные всегда инициализируются нулевым значением в самом начале программы.
volatileэтот спецификатор предписывает компилятору не предпринимать никаких действий по оптимизации работы с переменной, а также, что значение такой переменной может быть изменено кем-либо помимо самой программы. Например, аппаратные средства периферийного модуля могут изменить содержимое своего регистра данных.

Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>