Лекция - Си
.pdfЯзык Си для микроконтроллера AT91SAM7S
(С) СПбГЭТУ «ЛЭТИ». Кафедра ИИСТ. 2014 г. |
1 |
Переменная
Переменная — именованная область памяти:
-имя;
-тип (→ размер в памяти);
-значение;
-время существования (как долго хранится);
-область видимости (откуда видна);
2
Целочисленные типы
Тип |
Происхождение имени типа |
Размер в памяти |
|
int |
'integer' - целое |
4 |
байта |
long int |
'long' - длинный |
4 |
байта |
short int |
'short' - короткий |
2 |
байта |
char |
'character' - символ |
1 |
байт |
Знаковые
(могут хранить положительные и отрицательные числа)
тип → знаковый_тип signed тип → знаковый_тип
Беззнаковые |
|
|
(только положительные числа) |
|
|
unsigned тип → беззнаковый_тип |
|
|
unsigned int; unsigned long int; unsigned short int; |
|
|
unsigned char; |
|
|
'int' может быть опущено |
|
|
unsigned int → unsigned; |
|
|
unsigned short int → unsigned short; |
3 |
|
short int → short; |
||
|
Способы записи целых чисел и инициализация переменных
Инициализация — присвоение начального значения;
// Фрагмент программы |
|
int offset = 25; |
// десятичная |
unsigned short a = 0xFFFF; |
// 16-ая |
char ch1 = 'a'; |
|
unsigned mask = 0x0000003F; |
|
unsigned char с; |
|
c = 25; |
|
short var = 020; |
// восьмеричная |
long Var1; |
|
Var1 = 0b0011; |
// двоичная |
4
Вещественные типы
Тип |
Происхождение имени типа |
Размер в памяти |
|
float |
'floating point' — плавающая |
4 |
байта |
|
точка |
|
|
double |
'double precision' — двойная |
8 |
байт |
|
точность |
|
|
Число с плавающей точкой:
-мантисса;
-показатель степени;
Свойства:
-Конечное множество значений;
-Константная относительная точность представления числа;
-Округления;
-Неассоциативность операций:
(A * B) * C ≈ A * (B * C)
5
Вещественные типы - примеры
float a = 1000000.1; // 1000000.125
double b1 |
= 5000.0000003; // |
5000.0000002999996 |
|
double b2 |
= b1 * 2.0; |
// |
10000.000000599999 |
float c1 = 1.0e+6; |
// 1 |
* 10^6 |
float |
c2 |
= |
1.4e-3; |
// 1.4 * 10^-3 = 0.0014 |
float |
c3 |
= |
10000.0; |
// 1 * 10^4 |
float result1 = c1 * c2; |
|
|
result1 = result1 * c3; // 14000000 |
|
|
float result2 = c2 * c3; |
|
|
result2 = result2 * c1; // 13999999 |
|
|
unsigned int adcCode = 180; |
|
|
double q = 3.3 / 256; |
6 |
|
double adcInputVoltage = adcCode * q; |
||
|
Логический тип
|
Тип |
Происхождение имени типа |
Размер в памяти |
|
bool |
'boolean' — булев (Дж. Буль) |
1 байт |
Значения |
«флаг» |
|
|
|
|
true — «правда» (1) false — «ложь» (0)
Примеры использования
// Заголовочный файл, необходимый для использования bool #include <stdbool.h>
...
bool buttonPressed = false; bool temperatureOk = true;
...
temperatureOk = false;
7
Тип void
('void' — пустой)
void — особый «тип»:
-создать переменную невозможно;
-показывает, что у функции отсутствуют аргументы;
-показывает, что функция не возвращает значения;
-используется для обобщённых указателей;
Примеры:
void func(void)
{
...
}
void *ptr = NULL;
8
Константы
Константа — переменная, которую невозможно изменить.
const тип → константный_тип
Преимущества констант:
-повышают читаемость исходного кода;
-уменьшают вероятность ошибок;
-упрощают компилятору задачу оптимизации кода;
Примеры:
const double q = 3.3 / 1024; unsigned int adcCode = 180;
double adcInputVoltage = adcCode * q; q = 0.125; // ошибка компиляции
const double pi = 3,1415926535; pi = 3.0; // ошибка компиляции
инициализация константы при её создании обязательна! 9
Классы памяти переменных
Класс памяти определяет:
-как долго хранится переменная в памяти;
-откуда к ней можно обратиться
Классы памяти:
- автоматический ( |
); |
|
- статический (static); |
|
|
- внешний ( |
/ extern); |
- регистровый (register);
Любая переменная относится к одному из возможных классов памяти;
10