ANSI C
Language
Introduction
Lection 5
Содержание
• Базовые типы данных
• Объявления переменных и констант
• Преобразования типов
27.09.2021 17:52 Introduction 2
Базовые типы данных
Тип данных
Размер в
байтах
Диапазон значений
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
Базовые типы данных
27.09.2021 17:52 Introduction 4
Объявления переменных
Синтаксис
<тип данных> <имя переменной> [= значение];
Примеры
unsigned char myNewVariable;
unsigned char counter = 10;
short a,b,c;
long long veryBigIntNumber = counter * 5000000;
float coef = 1/3;
27.09.2021 17:52 Introduction 5
Объявления констант
Синтаксис
const [тип данных] <имя константы> = <значение>;
Примеры
const unsigned int maxTemp = 100;
const minTemp = 0;
27.09.2021 17:52 Introduction 6
#define или const вот в чем вопрос?
Преобразования типов
Преобразование значения переменной одного типа в
значение другого типа называется приведение типа и
бывает явным и неявным:
• при явном приведении перед выражением следует
указать в круглых скобках имя типа, к которому
необходимо преобразовать исходное значение.
• при неявном приведении преобразование происходит
автоматически, по правилам, заложенным в языке Си.
27.09.2021 17:52 Introduction 7
Преобразования типов (правила)
Тип преобразуется к наиболее общему из всех операндов.
• Если в выражении появляются операнды различных типов, то они преобразуются к некоторому
общему типу, при этом к каждому арифметическому операнду применяется такая последовательность
правил:
• Если один из операндов в выражении имеет тип 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
Пример #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;
Пример #2
27.09.2021 17:52 Introduction 10
int main()
{
int i = 1000000;
char c = i;
printf("Value is %d", c);
return 0;
}
Пример #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
Пример #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);
}
Пример #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
Пример #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);
}
Пример #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);
}
Пример #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
Пример #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);
}
Пример #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
Пример #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);
}
Пример #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
Пример #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);
}
Пример #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

C language lect_05_introduction

  • 1.
  • 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
  • 4.
  • 5.
    Объявления переменных Синтаксис <тип данных><имя переменной> [= значение]; Примеры unsigned char myNewVariable; unsigned char counter = 10; short a,b,c; long long veryBigIntNumber = counter * 5000000; float coef = 1/3; 27.09.2021 17:52 Introduction 5
  • 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:52Introduction 10 int main() { int i = 1000000; char c = i; printf("Value is %d", c); return 0; }
  • 11.
    Пример #2 27.09.2021 17:52Introduction 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:52Introduction 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:52Introduction 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:52Introduction 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:52Introduction 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:52Introduction 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:52Introduction 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:52Introduction 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:52Introduction 19 int main() { unsigned char i = 250; signed char s = i; printf("Value is %d, %d", i, s); }
  • 20.
    Пример #6 27.09.2021 17:52Introduction 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:52Introduction 21 int main() { unsigned char i = 50; signed char s = i; printf("Value is %d, %d", i, s); }
  • 22.
    Пример #7 27.09.2021 17:52Introduction 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

  • #4 Размер переменных в си не определён явно, как размер в байтах. В стандарте только указано, что char <= short <= int <= long <= long long
  • #5 MISRA C — стандарт разработки программного обеспечения на языке Си, разработанный MISRA (Motor Industry Software Reliability Association). Цель стандарта — улучшить безопасность, переносимость и надежность программ для встраиваемых систем. Это набор ужесточающих правил для языка Си. Также существует набор похожих руководящих принципов для языка C++ под названием MISRA C ++. В настоящее время стандарты MISRA используются не только в автомобильной индустрии, но также и в аэрокосмической, телекоммуникационной, разработке медицинских устройств, военных проектах, и других…
  • #6 Для хранения различных данных в языках программирования используют переменные. Переменной называется область памяти, имеющая имя, которое иначе называют идентификатором. При объявлении переменной компилятор отводит ей место в памяти в зависимости от её типа. Давая переменной имя, программист одновременно тем же именем называет и область памяти, куда будут записываться значения переменной для хранения. Хорошим стилем является осмысленное именование переменных. Разрешается использовать строчные и прописные буквы, цифры и символ подчёркивания, который в Си считается буквой. Первым символом обязательно должна быть буква, в имени переменной не должно быть пробелов. В современных версиях компиляторов длина имени практически не ограничена. Имя переменной не может совпадать с зарезервированными ключевыми словами. Заглавные и строчные буквы в именах переменных различаются, переменные a и A — разные переменные. Вопросы к аудитории: - чему равно значение myNewVariable.
  • #7 Переменная любого типа может быть объявлена как немодифицируемая. Это достигается добавлением ключевого слова const к спецификатору типа. Переменные с типом const представляют собой данные, используемые только для чтения, то есть этой переменной не может быть присвоено новое значение. Если после слова const отсутствует спецификатор типа, то константы рассматриваются как величины со знаком, и им присваивается тип int или long int в соответствии со значением константы. Преимущества const по сравнению с #define
  • #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 (знаковый или беззнаковый).
  • #10 Какие значения a,b,c будут на выходе?