2. Содержание
• Базовые типы данных
• Объявления переменных и констант
• Преобразования типов
27.09.2021 17:52 Introduction 2
3. Базовые типы данных
Тип данных
Размер в
байтах
Диапазон значений
char (он же signed char) 1 -128 … 127
unsigned char 1 0 … 255
short (он же signed short) 2 -32 767 … 32 767
unsigned short 2 0 … 65 535
long (он же signed long) 4 -2 147 483 647 … 2 147 483 647
unsigned long 4 0 … 4 294 967 295
long long 8 -(263 - 1) … (263 - 1)
unsigned long long 8 0 … (264 - 1)
(signed ) int / unsigned int 2 / 4 Размер зависит от разрядности микроконтроллера
float 4 1E-37 …1E+37 (точность не менее 6 значащих цифр)
double 8 1E-37 …1E+37 (точность не менее 10 значащих цифр)
long double 10 1E-37 …1E+37 (точность не менее 10 значащих цифр)
bool 1 FALSE (0) или TRUE (1)
27.09.2021 17:52 Introduction 3
6. Объявления констант
Синтаксис
const [тип данных] <имя константы> = <значение>;
Примеры
const unsigned int maxTemp = 100;
const minTemp = 0;
27.09.2021 17:52 Introduction 6
#define или const вот в чем вопрос?
7. Преобразования типов
Преобразование значения переменной одного типа в
значение другого типа называется приведение типа и
бывает явным и неявным:
• при явном приведении перед выражением следует
указать в круглых скобках имя типа, к которому
необходимо преобразовать исходное значение.
• при неявном приведении преобразование происходит
автоматически, по правилам, заложенным в языке Си.
27.09.2021 17:52 Introduction 7
8. Преобразования типов (правила)
Тип преобразуется к наиболее общему из всех операндов.
• Если в выражении появляются операнды различных типов, то они преобразуются к некоторому
общему типу, при этом к каждому арифметическому операнду применяется такая последовательность
правил:
• Если один из операндов в выражении имеет тип long double, то остальные тоже преобразуются к типу
long double.
• В противном случае, если один из операндов в выражении имеет тип double, то остальные тоже
преобразуются к типу double.
• В противном случае, если один из операндов в выражении имеет тип float, то остальные тоже
преобразуются к типу float.
• В противном случае, если один из операндов в выражении имеет тип unsigned long, то остальные тоже
преобразуются к типу unsigned long.
• В противном случае, если один из операндов в выражении имеет тип long, то остальные тоже
преобразуются к типу long.
• В противном случае, если один из операндов в выражении имеет тип unsigned, то остальные тоже
преобразуются. к типу unsigned.
• В противном случае все операнды преобразуются к типу int. При этом тип char преобразуется в int со
знаком; тип unsigned char в int, у которого старший байт всегда нулевой; тип signed char в int, у
которого в знаковый разряд передается знак из сhar; тип short в int (знаковый или беззнаковый).
27.09.2021 17:52 Introduction 8
9. Пример #1
Явное приведение типа
unsigned char a;
unsigned long b;
float c;
a = 10;
b = (unsigned long)a;
c = (float)b;
27.09.2021 17:52 Introduction 9
Неявное приведение типа
unsigned char a;
unsigned long b;
float c;
с = 1000.5;
b = с;
a = b;
10. Пример #2
27.09.2021 17:52 Introduction 10
int main()
{
int i = 1000000;
char c = i;
printf("Value is %d", c);
return 0;
}
11. Пример #2
27.09.2021 17:52 Introduction 11
int main()
{
int i = 1000000;
char c = i;
printf("Value is %d", c);
return 0;
}
Value is 64
12. Пример #3
27.09.2021 17:52 Introduction 12
int main()
{
int i = 8;
int j = 3;
float f_res = i / j;
printf("Result is %.10f", f_res);
}
13. Пример #3
27.09.2021 17:52 Introduction 13
int main()
{
int i = 8;
int j = 3;
float f_res = i / j;
printf("Result is %.10f", f_res);
}
Result is 2.0000000000
14. Пример #3
27.09.2021 17:52 Introduction 14
Result is 2.6666667461
int main()
{
int i = 8;
int j = 3;
float f_res = (float) i / (float) j;
printf("Result is %.10f", f_res);
}
15. Пример #4
27.09.2021 17:52 Introduction 15
int main()
{
unsigned int i = 65535;
unsigned char c = i;
unsigned int j = c;
printf("Value i=%u, c=%u, j=%u", i, c, j);
}
16. Пример #4
27.09.2021 17:52 Introduction 16
int main()
{
unsigned int i = 65535;
unsigned char c = i;
unsigned int j = c;
printf("Value i=%u, c=%u, j=%u", i, c, j);
}
Value i=65535, c=255, j=255
17. Пример #5
27.09.2021 17:52 Introduction 17
int main()
{
unsigned int i = 65535;
unsigned long long j = i;
printf("Value is %u, %llu", i, j);
}
18. Пример #5
27.09.2021 17:52 Introduction 18
int main()
{
unsigned int i = 65535;
unsigned long long j = i;
printf("Value is %u, %llu", i, j);
}
Value is 65535, 65535
19. Пример #6
27.09.2021 17:52 Introduction 19
int main()
{
unsigned char i = 250;
signed char s = i;
printf("Value is %d, %d", i, s);
}
20. Пример #6
27.09.2021 17:52 Introduction 20
int main()
{
unsigned char i = 250;
signed char s = i;
printf("Value is %d, %d", i, s);
}
Value is 250, -6
21. Пример #7
27.09.2021 17:52 Introduction 21
int main()
{
unsigned char i = 50;
signed char s = i;
printf("Value is %d, %d", i, s);
}
22. Пример #7
27.09.2021 17:52 Introduction 22
int main()
{
unsigned char i = 50;
signed char s = i;
printf("Value is %d, %d", i, s);
}
Value is 50, 50
Editor's Notes
Размер переменных в си не определён явно, как размер в байтах. В стандарте только указано, чтоchar <= short <= int <= long <= long long
MISRA C — стандарт разработки программного обеспечения на языке Си, разработанный MISRA (Motor Industry Software Reliability Association). Цель стандарта — улучшить безопасность, переносимость и надежность программ для встраиваемых систем. Это набор ужесточающих правил для языка Си. Также существует набор похожих руководящих принципов для языка C++ под названием MISRA C ++. В настоящее время стандарты MISRA используются не только в автомобильной индустрии, но также и в аэрокосмической, телекоммуникационной, разработке медицинских устройств, военных проектах, и других…
Для хранения различных данных в языках программирования используют переменные. Переменной называется область памяти, имеющая имя, которое иначе называют идентификатором. При объявлении переменной компилятор отводит ей место в памяти в зависимости от её типа.Давая переменной имя, программист одновременно тем же именем называет и область памяти, куда будут записываться значения переменной для хранения.Хорошим стилем является осмысленное именование переменных. Разрешается использовать строчные и прописные буквы, цифры и символ подчёркивания, который в Си считается буквой. Первым символом обязательно должна быть буква, в имени переменной не должно быть пробелов. В современных версиях компиляторов длина имени практически не ограничена. Имя переменной не может совпадать с зарезервированными ключевыми словами. Заглавные и строчные буквы в именах переменных различаются, переменные a и A — разные переменные.
Вопросы к аудитории:
- чему равно значение myNewVariable.
Переменная любого типа может быть объявлена как немодифицируемая. Это достигается добавлением ключевого слова const к спецификатору типа. Переменные с типом const представляют собой данные, используемые только для чтения, то есть этой переменной не может быть присвоено новое значение. Если после слова const отсутствует спецификатор типа, то константы рассматриваются как величины со знаком, и им присваивается тип int или long int в соответствии со значением константы.
Преимущества const по сравнению с #define
Тип преобразуется к наиболее общему из всех операндов.
Если в выражении появляются операнды различных типов, то они преобразуются к некоторому общему типу, при этом к каждому арифметическому операнду применяется такая последовательность правил:
Если один из операндов в выражении имеет тип long double, то остальные тоже преобразуются к типу long double.
В противном случае, если один из операндов в выражении имеет тип double, то остальные тоже преобразуются к типу double.
В противном случае, если один из операндов в выражении имеет тип float, то остальные тоже преобразуются к типу float.
В противном случае, если один из операндов в выражении имеет тип unsigned long, то остальные тоже преобразуются к типу unsigned long.
В противном случае, если один из операндов в выражении имеет тип long, то остальные тоже преобразуются к типу long.
В противном случае, если один из операндов в выражении имеет тип unsigned, то остальные тоже преобразуются. к типу unsigned.
В противном случае все операнды преобразуются к типу int. При этом тип char преобразуется в int со знаком; тип unsigned char в int, у которого старший байт всегда нулевой; тип signed char в int, у которого в знаковый разряд передается знак из сhar; тип short в int (знаковый или беззнаковый).