4.1.3. Типы данных
(Руководство разработчика по микроконтроллерам семейства HCS08)В языке C существует 3 основных типа данных: целочисленные integer, с плавающей запятой float и специальный тип для спецификации пустых значений void. Целочисленные данные могут быть представлены как в формате со знаком signed, так и без знака unsigned. В последнем случае значения переменной могут быть только положительными. Числа с плавающей запятой типа float могут быть как целыми, так и дробными. Тип данных void преимущественно используется для объявления функций, которые не используют входных переменных для своей работы и не возвращают каких-либо значений.
Язык программирования C поддерживает несколько модификаторов типа данных:
— | для сужения диапазона чисел; | |
— | для расширения диапазона чисел; | |
— | для определения знаковых переменных; | |
— | для определения переменных без знака. |
В соответствии со стандартом ANSI все типы данных по умолчанию считаются знаковыми, т.е. signed. Для того чтобы выбранный тип данных, например 16-битный integer, использовался в формате без знака, перед определением типа данных необходимо применить модификатор unsigned, т.е. записать unsigned integer. Исключением из этого правила является тип данных char. Переменные типа char по умолчанию могут принимать только положительные значения, т.е. по умолчанию имеют модификатор unsigned. Список возможных типов данных языка C по стандарту ANSI представлен в Табл.4.2.
Таблица4.2. Типы данных языка C
Тип данных | Диапазон значений | Размер памяти в байтах |
---|---|---|
unsigned char, char | 0...255 | 1 |
signed char | –128...+127 | 1 |
unsigned int, unsigned short int | 0...65535 | 2 |
int, signed int, short int, signed short int | –32768...+32767 | 2 |
unsigned long int | 0...4294967295 | 4 |
long int, signed long int | –2147483648...+2147483647 | 4 |
float | 1.18×10–38...3.4×1038 | 4 |
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. Имя переменной — это ее название, которое будет использоваться в выражениях и операциях. Примеры объявления переменных:
unsignedintmy_var;//Беззнаковаяцелочисленнаяпеременнаятипаint
charfirst,second;//Двеположительныеоднобайтныезнаковыепеременные
float_result;//Объявлениедробнойпеременной_result;
Функции в составе преграммного кода тоже должны быть поименованы. При выборе имен для функций следует иметь в виду следующие ограничения:
- Имена должны содержать только буквы, цифры и символ подчеркивания. Все остальные символы, включая пробел, запрещены.
- Имена должны начинаться с буквы или знака подчеркивания.
- Максимальная длина имени функции не должна превышать 31 символа.
- В именах имеет значение регистр символов, т.е. переменные TEST и Test считаются разными.
- Нельзя использовать ключевые слова языка C в качестве имен переменных.
4.1.3.2. Инициализация переменных
В языке C есть возможность инициализировать переменные сразу во время их объявления. Это можно сделать, дописав начальное значение в выражение объявления:
charv2=10;//Объявлениепеременнойv2иприсвоениеначальногозначения10
Для инициализации переменных можно использовать шестнадцатеричные и восмеричные числа:
charv4=010;//Переменнаяv4сначальнымзначением8вдесятичнойсистемесчисления
Также можно использовать символы для инициализации переменной:
//Реальноезначениеv5=65—этоASCII-коддлясимвола«A»
Наконец, переменную можно инициализировать строкой:
В данном случае компилятор автоматически зарезервирует необходимое количество байтов в памяти, чтобы записать всю строку и завершающий символ (в языке C все строки заканчиваются символом 0x00).
В случае, если в строку необходимо записать один из неотображаемых символов, например Backspace, следует использовать символ «/». В Табл.4.3 приведены управляющие последовательности с символом «/» для ввода некоторых неотображаемых символов и производства некоторых действий при компиляции.
Таблица4.3. Управляющие последовательности для ввода неотображаемых символов
Символ | Описание |
---|---|
/b | Backspace (ASCII BS) |
/f | Новая страница (ASCII FF) |
/n | Новая строка (ASCII LF) |
/r | Возврат каретки (ASCII CR) |
/“ | Перевернутые “ |
/’ | Апостроф ’ |
/0 | Ноль |
// | Инвертирование строки |
/N | Восьмеричная константа |
/xN | Шестандцатеричная константа |
Далее приведены две строки программного кода, в которых использются управляющие последовательности.
charstr2[]={"test/0x20TEST"};//ВставляетпробелмеждуtestиTEST
4.1.3.3. Спецификаторы класса памяти
В дополнение к спецификатору типа данных в языке C существуют спецификаторы классов памяти. Спецификатор определяет порядок размещения переменой в памяти. Выделяют следующие спецификаторы:
— | автоматически определяет положение переменной в памяти. Такой класс хранения используется для локальных переменных. Ранее было отмечено, что локальная переменная может потерять свое значение, если исполняемый программный код уже вышел за пределы функции или блока, в котором эта переменная была объявлена. Спецификатор auto в настоящее время не используется стандартом ANSI, по умолчанию все локальные переменные имеют класс хранения auto. | |
— | определяет константу, т.е. такую переменную, значение которой не может быть изменено программой в ходе ее выполнения. Обычно константы хранятся в энергонезависимой флэш-памяти. | |
— | определяет глобальную переменную, которая была объявлена вне программы, т.е. в другом модуле, который был подключен к рассматриваемому модулю. | |
— | переменные данного класса хранения по возможности записываются не в память ОЗУ, а в регистры общего назначения ЦП. Обычно это ускоряет работу программы, но для устройств HCS08 данный класс практически бесполезен из-за малого количества регистров общего назначения в ЦП. | |
— | определяет переменную, время жизни которой равно времени работы программы. Статические переменные могут быть как глобальными, так и локальными. Локальные статические переменные не уничтожаются после выхода из функции, в которой они были объявлены. Локальные статические переменные сохраняют свое значение между обращениями к функции. Такие переменные можно интерпретировать как глобальные переменные, но с ограниченной видимостью. А глобальные статические переменные можно представить как глобальные, но с побочным эффектом невидимости во внешних классах по отношению к родительскому, т.е. к тому, где была объявлена переменная. Статические переменные всегда инициализируются нулевым значением в самом начале программы. | |
— | этот спецификатор предписывает компилятору не предпринимать никаких действий по оптимизации работы с переменной, а также, что значение такой переменной может быть изменено кем-либо помимо самой программы. Например, аппаратные средства периферийного модуля могут изменить содержимое своего регистра данных. |
Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>