C/C++ Типы данных, переменные
Для того чтобы программировать — нам надо уметь создавать и оперировать с числами.
В языках программирования C и C++ для этого существуют некие контейнеры/оболочки предоставляющие доступ к наиболее удобным типам данных:
- bool: логический тип. Может принимать одну из двух значений true (истина) и false (ложь). Размер занимаемой памяти для этого типа точно не определен.
- char: представляет один символ в кодировке ASCII. Занимает в памяти 1 байт (8 бит). Может хранить любое значение из диапазона от -128 до 127, либо от 0 до 255
- signed char: представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от -128 до 127
- unsigned char: представляет один символ. Занимает в памяти 1 байт (8 бит). Может хранить любой значение из диапазона от 0 до 255
- wchar_t: представляет расширенный символ. На Windows занимает в памяти 2 байта (16 бит), на Linux — 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 65 535 (при 2 байтах), либо от 0 до 4 294 967 295 (для 4 байт)
- char16_t: представляет один символ в кодировке Unicode. Занимает в памяти 2 байта (16 бит). Может хранить любой значение из диапазона от 0 до 65 535
- char32_t: представляет один символ в кодировке Unicode. Занимает в памяти 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 4 294 967 295
- short: представляет целое число в диапазоне от –32768 до 32767. Занимает в памяти 2 байта (16 бит).Данный тип также имеет синонимы short int, signed short int, signed short.
- unsigned short: представляет целое число в диапазоне от 0 до 65535. Занимает в памяти 2 байта (16 бит).Данный тип также имеет синоним unsigned short int.
- int: представляет целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита). Диапазон предельных значений соответственно также может варьироваться от –32768 до 32767 (при 2 байтах) или от −2 147 483 648 до 2 147 483 647 (при 4 байтах). Но в любом случае размер должен быть больше или равен размеру типа short и меньше или равен размеру типа longДанный тип имеет синонимы signed int и signed.
- unsigned int: представляет положительное целое число. В зависимости от архитектуры процессора может занимать 2 байта (16 бит) или 4 байта (32 бита), и из-за этого диапазон предельных значений может меняться: от 0 до 65535 (для 2 байт), либо от 0 до 4 294 967 295 (для 4 байт).В качестве синонима этого типа может использоваться unsigned
- long: представляет целое число в диапазоне от −2 147 483 648 до 2 147 483 647. Занимает в памяти 4 байта (32 бита).У данного типа также есть синонимы long int, signed long int и signed long
- unsigned long: представляет целое число в диапазоне от 0 до 4 294 967 295. Занимает в памяти 4 байта (32 бита).Имеет синоним unsigned long int.
- long long: представляет целое число в диапазоне от −9 223 372 036 854 775 808 до +9 223 372 036 854 775 807. Занимает в памяти, как правило, 8 байт (64 бита).Имеет синонимы long long int, signed long long int и signed long long.
- unsigned long long: представляет целое число в диапазоне от 0 до 18 446 744 073 709 551 615. Занимает в памяти, как правило, 8 байт (64 бита).Имеет синоним unsigned long long int.
- float: представляет вещественное число ординарной точности с плавающей точкой в диапазоне +/- 3.4E-38 до 3.4E+38. В памяти занимает 4 байта (32 бита)
- double: представляет вещественное число двойной точности с плавающей точкой в диапазоне +/- 1.7E-308 до 1.7E+308. В памяти занимает 8 байт (64 бита)
- long double: представляет вещественное число двойной точности с плавающей точкой не менее 8 байт (64 бит). В зависимости от размера занимаемой памяти может отличаться диапазон допустимых значений.
- void: тип без значенияТакже иногда используются типы данных uint8_t / uint16 и тд.Для создания переменной используется следующий синтаксис:
тип «название» = значение;
можно инициализировать однотипные переменные через запятую (в некоторых IDE через =)Если у вас нет значения для переменной — то лучше присваивать ей 0.
Пример создания переменных приведен ниже.//________________________________
К типам данных нужно быть крайне внимательным иначе можно получить ошибки и некоторые из них трудно отследить, например:unsigned short a1=65500, b1=10, c1=1000; unsigned short result_1=a1+b1; unsigned short result_2=a1+c1; cout<<"result_1= \t"<<result_1<<endl; //выводим информацию в консоль cout<<"result_2= \t"<<result_2<<endl; //выводим информацию в консольПри выполнении этого кода result_1 посчитается правильно и примет значение 65500+10=65510, но при вычислении result_2 будет ошибка, т.к. 65500+1000=66500
а тип данных unsigned short может хранить информацию 0-65535
В результате при вычислении rezult_2 будет переполнение переменной и получится значение 66500-65535-1=964. (-1 т.к. переполнение и сброс в 0)Думаю наглядно видно, что ошибка будет «плавающей» и найти ее может быть нелегко, особенно внутри большого участка кода.
Также стоит быть внимательными при работе с signed/unsigned переменными, если бы мы rezult сделали signed — он был бы не корректным.Также стоит отметить, что приведенный выше код позволяет считать только положительные числа — т.к. использовались без знаковые переменные.