Змінні. Скільки "важать" типи даних Змінна short

При написанні програми будь-якою мовою вам потрібно використовувати різні змінні для зберігання різної інформації. Змінні – це не що інше, як зарезервовані осередки пам'яті для зберігання значень. Це означає, що під час створення змінної ви зберігаєте деякий простір у пам'яті.

Ви можете зберігати інформацію різних типів даних, таких як символ, широкий символ, ціле число, плаваюча точка, подвійна плаваюча точка, логічне значення тощо. .

Примітивні вбудовані типи

C ++ пропонує програмісту багатий набір вбудованих, а також типів користувача даних. У наступних таблицях перераховано сім основних типів даних C++:

Type Keyword
Boolean bool
Character char
Integer int
Floating point float
Double floating point double
Valueless void
Wide character wchar_t

Деякі з основних типів можуть бути змінені за допомогою одного або декількох модифікаторів цього типу:

  • signed
  • unsigned
  • short

У наступній таблиці показаний тип змінної, обсяг пам'яті, який потрібний для зберігання значення в пам'яті, і те, що є максимальним та мінімальним значенням, яке може бути збережено у таких змінних.

Type Typical Bit Width Typical Range
char 1byte -127 to 127 or 0 to 255
unsigned char 1byte 0 to 255
signed char 1byte -127 to 127
int 4bytes -2147483648 to 2147483647
unsigned int 4bytes 0 to 4294967295
signed int 4bytes -2147483648 to 2147483647
short int 2bytes -32768 to 32767
unsigned short int Range 0 to 65,535
signed short int Range -32768 to 32767
long int 4bytes -2,147,483,648 to 2,147,483,647
signed long int 4bytes same as long int
unsigned long int 4bytes 0 to 4,294,967,295
float 4bytes +/- 3.4e +/- 38 (~7 digits)
double 8bytes
long double 8bytes +/- 1.7e +/- 308 (~15 digits)
wchar_t 2 або 4 bytes 1 wide character

Розмір змінних може відрізнятися від розміру, зазначеного в таблиці, в залежності від компілятора і комп'ютера, який ви використовуєте. Нижче наведено приклад, який надасть правильний розмір різних типів даних на вашому комп'ютері.

#include using namespace std; int main() ( cout<< "Size of char: " << sizeof(char) << endl; cout << "Size of int: " << sizeof(int) << endl; cout << "Size of short int: " << sizeof(short int) << endl; cout << "Size of long int: " << sizeof(long int) << endl; cout << "Size of float: " << sizeof(float) << endl; cout << "Size of double: " << sizeof(double) << endl; cout << "Size of wchar_t: " << sizeof(wchar_t) << endl; return 0; }

У цьому прикладі використовується endl, який вводить символ нового рядка після кожного рядка, а оператор<< используется для передачи нескольких значений на экран. Мы также используем оператор sizeof()для отримання різних типів даних.

Коли наведений вище код компілюється і виконується, він робить наступний результат, який може змінюватись від машини до машини:

Кількість char: 1 Кількість int: 4 Кількість шорти: 2 long int: 4 Кількість float: 4 Кількість ダブル: 8 Кількість wchar_t: 4

Декларації typedef

Ви можете створити нове ім'я для існуючого типу за допомогою typedef. Нижче наведено простий синтаксис для визначення нового типу з використанням typedef:

Typedef type newname;

Наприклад, наступне говорить компілятору, що ногами є інше ім'я для int:

Typedef int feet;

Тепер наступна декларація є абсолютно легальною і створює цілочисленну змінну, яка називається відстанню:

Feet distance;

Перелічені типи

Перерахований тип оголошує необов'язкове ім'я типу та набір із нуля або більше ідентифікаторів, які можуть використовуватись як значення типу. Кожен перечислювач є константою, тип якої є перерахуванням. Для створення переліку потрібне використання ключового слова enum. Загальний вид типу перерахування:

Enum enum-name (list of names) var-list;

Тут enum-name це ім'я типу перерахування. Список імен розділяється комою. Наприклад, наступний код визначає перерахування кольорів, званих кольорами, та змінної з кольору типу. Нарешті, c надається значення «blue».

Enum color (red, green, blue) c; c = blue;

За замовчуванням значення першого імені одно 0, друге ім'я має значення 1, а третє - значення 2 тощо. буд. Але можна вказати ім'я, певне значення, додавши ініціалізатор. Наприклад, у наступному перерахуванні зелений матиме значення 5.

Enum color (red, green = 5, blue);

Тут blue буде мати значення 6, тому що кожне ім'я буде більшим, ніж попереднє.

У цьому уроці ми розглянемо цілі численні типи даних, їх діапазони значень, розподіл, а також переповнення: що це таке і приклади.

Цілочисленні типи даних

Цілочисельний тип даних- це тип, змінні якого можуть містити лише цілі числа (без дробової частини, наприклад: -2, -1, 0, 1, 2). У C++ є п'ять основних цілих типів, доступних для використання:

Примітка: Тип char - це особливий випадок, він є як цілим, так і символьним типом даних. Про це детальніше ми поговоримо в одному з наступних уроків.

Основною відмінністю між цілими типами вище є їх , чим він більше, тим більше значень зможе зберігати змінна цього типу.

Визначення цілісних змінних

Відбувається так:

char c; short int si; // допустимо short s; // Переважно int i; long int li; // Допустимо long l; // Переважно long long int lli; // Допустимо long long ll; // Переважно

У той час як повні назви short int , long int і long long int можуть використовуватися, їх скорочені версії (без int) кращі для використання. До того ж постійне додавання int ускладнює читання коду (легко сплутати зі змінною).

Діапазони значень та знак цілих типів даних

Як ви вже знаєте з попереднього уроку, змінна з n кількістю біт може зберігати 2 n можливих значень. Але що це за значення? Ті, що знаходяться в діапазоні. Діапазон- Це значення від та до, які може зберігати певний тип даних. Діапазон цілісної змінної визначається двома факторами: її розміром (у бітах) та її знайомий(який може бути signedабо unsigned).

Цілочисленний тип signed (зі знаком) означає, що змінна може містити як позитивні, і негативні числа. Щоб оголосити змінну як signed, використовуйте ключове слово signed:

signed char c; signed short s; signed int i; signed long l; signed long long ll;

signed char c;

signed short s;

signed int i;

signed long l;

signed long long ll;

За замовчуванням ключове слово signed пишеться перед типом даних.

1-байтова цілісна змінна зі знаком (signed) має діапазон значень від -128 до 127. Будь-яке значення від -128 до 127 (включно) може зберігатися в ній безпечно.

У деяких випадках ми можемо заздалегідь знати, що негативні числа в програмі не використовуватимуться. Це дуже часто зустрічається при використанні змінних для зберігання кількості або розміру чогось (наприклад, ваше зростання або вага не може бути негативним).

Цілочисленний тип unsigned (без знаку) може містити лише позитивні числа. Щоб оголосити змінну як unsigned, використовуйте ключове слово unsigned:

unsigned char c; unsigned short s; unsigned int i; unsigned long l; unsigned long long ll;

unsigned char c;

unsigned short s;

unsigned int i;

unsigned long l;

unsigned long long ll;

1-байтова цілочисленна змінна без знака (unsigned) має діапазон значень від 0 до 255.

Зверніть увагу, оголошення змінної як unsigned означає, що вона не зможе містити негативні числа (тільки позитивні).

Тепер, коли ви зрозуміли різницю між signed і unsigned, розглянемо діапазони значень різних типів даних:

Розмір/Тип Діапазон значень
1 байт signed від -128 до 127
1 байт unsigned від 0 до 255
2 байти signed від -32768 до 32767
2 байти unsigned від 0 до 65 535
4 байти signed від -2 147 483 648 до 2 147 483 647
4 байти unsigned від 0 до 4 294 967 295
8 байтів signed від -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
8 байтів unsigned від 0 до 18 446 744 073 709 551 615

Для математиків: змінна signed з n-ною кількістю біт має діапазон від -(2 n-1) до 2 n-1 -1. Змінна unsigned з n-ною кількістю біт має діапазон від 0 до (2 n)-1. Для нематематиків: використовуємо таблицю 🙂

Початківці програмісти іноді плутаються між signed та unsigned змінними. Але є простий спосіб запам'ятати їхні відмінності. Чим відрізняється від'ємне число від позитивного? Правильно! Мінусом спереду. Якщо мінуса немає, то число — позитивне. Отже, цілий тип зі знаком (signed) означає, що мінус може бути, тобто. числа може бути як позитивними, і негативними. Цілочисленний тип без знака (unsigned) означає, що мінус спереду повністю відсутня, тобто. числа можуть бути лише позитивними.

Що використовується за замовчуванням: signed чи unsigned?

То що станеться, якщо ми оголосимо змінну без вказівки signed чи unsigned?

Всі цілі типи даних, крім char, є signed за замовчуванням. Тип char може бути як signed, так і unsigned (але зазвичай signed).

У більшості випадків ключове слово signed не пишеться (воно і так використовується за умовчанням), за винятком типу char (тут краще уточнити).

Програмісти, як правило, уникають використання цілих типів unsigned, якщо в цьому немає особливої ​​потреби, так як зі змінними unsigned помилок, за статистикою, виникає більше, ніж зі змінними signed.

Правило: Використовуйте цілі типи signed, замість unsigned.

Переповнення

Питання: «Що станеться, якщо ми спробуємо використати значення, яке знаходиться поза діапазоном значень певного типу даних?». Відповідь: «Переповнення».

Переповнення(англ. «overflow») трапляється при втраті біт через те, що змінної не було виділено достатньо пам'яті для їх зберігання.

Приклади переповнення

Розглянемо змінну unsigned, яка складається з 4 бітів. Будь-яке з двійкових чисел, перерахованих у таблиці вище, поміститися всередині цієї змінної.

«Але що станеться, якщо ми спробуємо надати значення, яке займає більше 4 бітів?». Правильно! Переповнення. Наша змінна буде зберігати лише чотири найменш значущих (ті, що праворуч) біта, всі інші - загубляться.

Наприклад, якщо ми спробуємо помістити число 21 у нашу 4-бітну змінну:

Десяткова система Двійкова система
21 10101

Число 21 займає 5 біт (10 101). 4 біти праворуч (0101) помістяться в змінну, а крайній лівий біт (1) просто загубиться. Тобто. наша змінна міститиме 0101, що дорівнює 101 (нуль спереду не вважається), а це вже число 5, а не 21.

Примітка: Про конвертацію чисел із двійкової системи в десяткову і навпаки буде окремий урок, де ми все детально розглянемо та обговоримо.

Тепер розглянемо приклад у коді (тип short займає 16 біт):

#include int main() ( unsigned short x = 65535; // найбільше значення, яке може зберігати 16-бітна unsigned змінна std::cout<< "x was: " << x << std::endl; x = x + 1; // 65536 - это число больше максимально допустимого числа из диапазона допустимых значений. Следовательно, произойдёт переполнение, так как переменнная x не может хранить 17 бит std::cout << "x is now: " << x << std::endl; return 0; }

#include

int main()

unsigned short x = 65535; // найбільше значення, яке може зберігати 16-бітна unsigned змінна

std :: cout<< "x was: " << x << std :: endl ;

x = x + 1; // 65536 - це число більше максимально допустимого числа діапазону допустимих значень. Отже, відбудеться переповнення, оскільки змінна x не може зберігати 17 біт

std :: cout<< "x is now: " << x << std :: endl ;

return 0;

x was: 65535
x is now: 0

Що трапилося? Відбулося переповнення, тому що ми спробували впхнути невпихуемое в змінну x .

Для тих, хто хоче знати більше:Число 65535 в двійковій системі числення представлено як 1111 1111 1111 1111. 65535 - це найбільше число, яке може зберігати 2-байтова (16 біт) цілочисленна змінна без знака, так як це число використовує всі 16 біт. Коли ми додаємо 1, то отримуємо число 65536. Число 65536 представлено в двійковій системі як 1 0000 0000 0000 0000, і займає 17 біт! Отже, найголовніший біт (яким є 1) губиться, а всі 16 біт справа - залишаються. Комбінація 0000 0000 0000 0000 відповідає десятковому 0, що є нашим результатом.

Аналогічним чином, ми отримаємо переповнення, використавши число менше мінімального з діапазону допустимих значень:

#include int main() ( unsigned short x = 0; // найменше значення, яке 2-байтова unsigned змінна може зберігати std::cout<< "x was: " << x << std::endl; x = x - 1; // переполнение! std::cout << "x is now: " << x << std::endl; return 0; }

#include

int main()

unsigned short x = 0; // найменше значення, яке 2-байтова unsigned змінна може зберігати

std :: cout<< "x was: " << x << std :: endl ;

x = x - 1; // Переповнення!

std :: cout<< "x is now: " << x << std :: endl ;

return 0;

Результат виконання програми вище:

x was: 0
x is now: 65535

Переповнення призводить до втрати інформації, але це ніколи не вітається. Якщо є хоч найменша підозра або припущення, що значенням змінної може бути число, яке знаходиться поза діапазоном допустимих значень використовуваного типу даних - використовуйте більше тип даних!

У цьому записі-шпаргалці наведено відомості про основні типи даних мови програмування C++ та особливості їх реалізації. Також, наприкінці запису складено таблицю з діапазонами значень цих типів.

Концепція типу даних

Основна мета будь-якої програми полягає у обробці даних. Дані різного типу зберігаються та обробляються по-різному. У будь-якій алгоритмічній мові кожна константа, змінна, результат обчислення виразу чи функції повинні мати певний тип.

Тип даних визначає:

  • внутрішнє представлення даних у пам'яті комп'ютера;
  • безліч значень, які можуть набувати величини цього типу;
  • операції та функції, які можна застосовувати до величин цього тину.

Виходячи з цих характеристик, програміст вибирає тип кожної величини, що використовується у програмі для представлення реальних об'єктів. Обов'язковий опис типу дозволяє компілятору перевірити допустимість різних конструкцій програми. Від типу величини залежать машинні команди, які використовуватимуться обробки даних.

Усі типи мови C++ можна розділити на основні і складові . У мові C++ визначено шість основнихтипів даних для подання цілих, речових, символьних та логічних величин. На основі цих типів програміст може вводити опис складовихтипів. До них відносяться масиви, перерахування, функції, структури, посилання, покажчики, об'єднання та класи.

Основні типи даних у C++

Основні (стандартні) типи даних часто називають арифметичними, оскільки їх можна використовувати в арифметичних операціях. Для опису основних типів визначено такі:

  1. int (цілий);
  2. char (символьний);
  3. wchar_t (розширений символьний);
  4. bool (логічний);
  5. float (речовий);
  6. double (речовий з подвійною точністю).

Перші чотири тини називають цілими ( цілими ), останні два - типами з плаваючою точкою . Код, який формує компілятор для обробки цілих величин, відрізняється від коду для величин з плаваючою точкою.

Існує чотири специфікатора типу , що уточнюють внутрішнє уявлення та діапазон значень стандартних типів:

  • short (короткий);
  • long (довгий);
  • signed (знаковий);
  • unsigned (беззнаковий).

Цілий тип (int)

Розмір типу int не визначається стандартом, а залежить від комп'ютера та компілятора. Для 16-розрядного процесора під величини цього типу відводиться 2 байти, для 32-розрядного - 4 байти.

Специфікатор short перед ім'ям типу вказує компілятор, що під число потрібно відвести 2 байти незалежно від розрядності процесора. Специфікатор long означає, що ціла величина займатиме 4 байти. Отже, на 16-разрядном комп'ютері еквіваленти int і short int, але в 32-разрядном - int і long int.

Внутрішнє уявлення величини цілого типу - ціле число у двійковому коді. При використанні специфікатора signed старший біт числа інтерпретується як знаковий (0 – позитивне число, 1 – негативне). Специфікатор unsigned дозволяє представляти лише позитивні числа, оскільки старший розряд сприймається як частина коду числа. Таким чином, діапазон значень типу int залежить від специфікаторів. Діапазони значень величин цілого типу з різними специфікаторами для IBM PC-сумісних комп'ютерів наведено у таблиці «Діапазони значень простих типів даних» наприкінці запису.

За замовчуванням усі цілочисленні типи вважаються знаковими, тобто специфікатор signed можна опускати.

Константам, які у програмі, приписується той чи інший тип відповідно до їх видом. Якщо цей тип з будь-яких причин не влаштовує програміста, він може явно вказати необхідний тип за допомогою суфіксів L, l (long) та U, u (unsigned). Наприклад, константа 32L матиме тип long і займатиме 4 байти. Можна використовувати суфікси L та U одночасно, наприклад, 0x22UL або 05Lu.

Примітка

Типи short int, long int, signed int і unsigned int можна скорочувати до short, long, signed і unsigned відповідно.

Символьний тип (char)

Під величину символьного типу відводиться кількість байт, достатню для розміщення будь-якого символу набору символів для даного комп'ютера, що й зумовило назву типу. Як правило, це один байт. Тип char, як і інші цілі типи, може бути зі знаком або знак. У величинах зі знаком можна зберігати значення в діапазоні від -128 до 127. При використанні специфікатора unsigned значення можуть перебувати в межах від 0 до 255. Цього достатньо для зберігання будь-якого символу з 256-символьного набору ASCII. Величини типу char застосовуються також для зберігання цілих чисел, що не перевищують межі зазначених діапазонів.

Розширений символьний тип (wchar_t)

Тип wchar_t призначений для роботи з набором символів, для кодування яких недостатньо 1 байта, наприклад Unicode. Розмір цього залежить від реалізації; як правило, він відповідає типу short. Рядкові константи типу wchar_t записуються з префіксом L, наприклад, L»Gates».

Логічний тип (bool)

Величини логічного типу можуть набувати лише значення true і false, які є зарезервованими словами. Внутрішня форма подання значення false – 0 (нуль). Будь-яке інше значення інтерпретується як true. При перетворенні до цілого типу true має значення 1.

Типи з плаваючою точкою (float, double та long double)

Стандарт C++ визначає три типи даних для зберігання речових значень: float, double та long double.

Типи даних з плаваючою точкою зберігаються в пам'яті комп'ютера інакше, ніж цілі. Внутрішнє уявлення речового числа складається з двох частин - мантиси та порядку. У IBM PC-сумісних комп'ютерах величини типу float займають 4 байти, у тому числі один двійковий розряд відводиться під знак мантиси, 8 розрядів під лад і 23 під мантису. Мантісса - це число, більше 1.0, але менше 2.0. Оскільки старша цифра мантиси завжди дорівнює 1, вона зберігається.

Для величин типу double, що займають 8 байт, під порядок і мантису відводиться 11 та 52 розряди відповідно. Довжина мантиси визначає точність числа, а довжина порядку – його діапазон.Як можна бачити з таблиці в кінці запису, при однаковій кількості байт, що відводиться під величини типу float і long int, діапазони їх допустимих значень сильно різняться через внутрішню форму подання.

Специфікатор long перед ім'ям типу double вказує, що під його величину приділяється 10 байт.

Константи з плаваючою точкою мають типовий тип double. Можна явно вказати тип константи за допомогою суфіксів F, f (float) та L, l (long). Наприклад, константа 2E+6L матиме тип long double, а константа 1.82f - тип float.

Для написання програм, що переносяться на різні платформи, не можна робити припущень про розмір типу int. Для отримання необхідно користуватися операцією sizeof, результатом якої є розмір типу в байтах. Наприклад, для операційної системи MS-DOS sizeof(int) дасть у результаті 2, а для Windows 98 або OS/2 результатом буде 4.

У стандарті ANSI діапазони значень для основних типів не задаються, визначаються тільки співвідношення між їх розмірами, наприклад:

sizeof(float) ≤ slzeof(double) ≤ sizeof(long double)
sizeof(char) ≤ slzeof(short) ≤ sizeof(int) ≤ sizeof(long)

Примітка

Мінімальні та максимальні допустимі значення для цілих типів залежать від реалізації та наведені у заголовному файлі (), характеристики речових типів - у файлі (), а також у шаблоні класу numeric_limits

Тип void

Крім перерахованих, до основних типів мови відноситься тип void, але безліч значень цього порожньо. Він використовується для визначення функцій, які не повертають значення, для вказівки порожнього списку аргументів функції як базовий тип для покажчиків і в операції приведення типів.

Діапазони значень простих типів даних у C++ для IBM PC-сумісних комп'ютерів

Q: Що означає термін IBM PC-сумісний комп'ютер?
A: IBM PC-сумісний комп'ютер (англ. IBM PC compatible) - комп'ютер, архітектурно близький до IBM PC, XT і AT. IBM PC-сумісні комп'ютери побудовані з урахуванням мікропроцесорів, сумісних з Intel 8086 (а, як відомо, всі випущені пізніше процесори Intel мають повну зворотну сумісність з 8086). По суті, це практично всі сучасні комп'ютери.

Різні види цілих і речових типів, що відрізняються діапазоном і точністю представлення даних, введені для того, щоб дати програмісту можливість найбільш ефективно використовувати можливості конкретної апаратури, оскільки від вибору типу залежить швидкість обчислень та обсяг пам'яті. Але оптимізована для комп'ютерів будь-якого одного типу програма може стати не переносимою на інші платформи, тому слід уникати залежностей від конкретних характеристик типів даних.

Тип Діапазон значень Розмір (байт)
bool true та false 1
signed char -128 … 127 1
unsigned char 0 … 255 1
signed short int -32 768 … 32 767 2
unsigned short int 0 … 65 535 2
signed long int -2 147 483 648 … 2 147 483 647 4
unsigned long int 0 … 4 294 967 295 4
float 3.4e-38 … 3.4e+38 4
double 1.7e-308 … 1.7C+308 8
long double 3.4e-4932 … 3.4e+4932 10

Для речових типів у таблиці наведені абсолютні величини мінімальних та максимальних значень.

У мові Сі розрізняють поняття "тип даних" та "модифікатор типу". Тип даних – це цілий, а модифікатор – зі знаком чи знака. Ціле зі знаком матиме як позитивні, і негативні значення, а ціле без знака – лише позитивні значення. У мові Сі можна назвати п'ять базових типів.

  • char – символьний.
  • Змінна типу char має розмір 1 байт, її значеннями є різні символи кодової таблиці, наприклад: 'ф', ':', 'j' (при запису в програмі вони полягають в одинарні лапки).

  • int – цілий.
  • Розмір змінної типу int у стандарті мови Сі не визначено. У більшості систем програмування розмір змінної типу int відповідає розміру машинного слова. Наприклад, у компіляторах для 16-розрядних процесорів змінна типу int має розмір 2 байти. У цьому випадку знакові значення цієї змінної можуть бути в діапазоні від -32768 до 32767.

  • float – речовий.
  • Ключове слово float дозволяє визначити змінні речовинного типу. Їх значення мають дрібну частину, що відокремлюється точкою, наприклад: -5.6, 31.28 і т.п. Речові числа можуть бути записані у формі з плаваючою точкою, наприклад: -1.09e+4. Число перед символом "е" називається мантисою, а після "е" - порядком. Змінна типу float займає у пам'яті 32 біти. Вона може набувати значення в діапазоні від 3.4е-38 до 3.4e+38.

  • double – речовий подвійний точності;
  • Ключове слово double дозволяє визначити речову змінну подвійної точності. Вона займає в пам'яті вдвічі більше місця, ніж змінна типу float. Змінна типу double може набувати значень в діапазоні від 1.7e-308 до 1.7e+308.

  • void – не має значення.
  • Ключове слово void використовується для нейтралізації значення об'єкта, наприклад, для оголошення функції, яка не повертає жодних значень.

Типи змінних:

Програми оперують із різними даними, які можуть бути простими та структурованими. Прості дані – це цілі та речові числа, символи та покажчики (адреси об'єктів у пам'яті). Цілі числа не мають, а речові мають дрібну частину. Структуровані дані – це масиви та структури; вони будуть розглянуті нижче.

Змінна – це комірка у пам'яті комп'ютера, яка має ім'я та зберігає певне значення. Значення змінної може змінюватись під час виконання програми. При записі в комірку нового значення старе стирається.

Хорошим стилем є осмислене найменування змінних. Ім'я змінної може містити від 1 до 32 символів. Дозволяється використовувати малі та великі літери, цифри та символ підкреслення, який у Сі вважається літерою. Першим символом обов'язково має бути буква. Ім'я змінної не може збігатися із зарезервованими словами.

Тип char

char - є найбільш економним типом. Тип char може бути знаковим та беззнаковим. Позначається як “signed char” (знаковий тип) та “unsigned char” (беззнаковий тип). Знаковий тип може зберігати значення від -128 до +127. Беззнаковий - від 0 до 255. Під змінну типу char відводиться 1 байт пам'яті (8 біт).

Ключові слова signed і unsigned вказують, як інтерпретується нульовий біт змінної, що оголошується, тобто, якщо вказано ключове слово unsigned, то нульовий біт інтерпретується як частина числа, в іншому випадку нульовий біт інтерпретується як знаковий.

Тип int

Цілочисленна величина int може бути short (короткою) або long (довгою). Ключове слово short ставиться після ключових слів signed чи unsigned. Таким чином, є типи: signed short int, unsigned short int, signed long int, unsigned long int.

Змінна типу signed short int (знакова коротка ціла) може набувати значень від -32768 до +32767, unsigned short int (беззнакова коротка ціла) – від 0 до 65535. Під кожну з них відводиться рівно по два байти пам'яті (16 біт).

При оголошенні змінної типу signed short int ключові слова signed і short можуть бути пропущені і такий тип змінної може бути оголошений просто int. Допускається і оголошення цього одного ключовим словом short.

Змінна unsigned short int може бути оголошена як unsigned int або unsigned short.

Під кожну величину signed long int або unsigned long int відводиться 4 байти пам'яті (32 біти). Значення змінних цього можуть бути в інтервалах від -2147483648 до 2147483647 і від 0 до 4294967295 відповідно.

Існують також змінні типу long long int, котрим відводиться 8 байт пам'яті (64 біта). Вони можуть бути знаковими та беззнаковими. Для знакового типу діапазон значень лежить у межах від -9223372036854775808 до 9223372036854775807, для беззнакового - від 0 до 18446744073709551615. Знаковий тип може бути оголошений і просто двома ключами.

Тип Діапазон Шістнадцятковий діапазон Розмір
unsigned char 0 … 255 0x00 … 0xFF 8 bit
signed char
або просто
char
-128 … 127 -0x80 … 0x7F 8 bit
unsigned short int
або просто
unsigned intабо unsigned short
0 … 65535 0x0000 … 0xFFFF 16 bit
signed short intабо signed int
або просто
shortабо int
-32768 … 32767 0x8000 … 0x7FFF 16 bit
unsigned long int
або просто
unsigned long
0 … 4294967295 0x00000000 … 0xFFFFFFFF 32 bit
signed long
або просто
long
-2147483648 … 2147483647 0x80000000 … 0x7FFFFFFF 32 bit
unsigned long long 0 … 18446744073709551615 0x0000000000000000 … 0xFFFFFFFFFFFFFFFFFF 64 bit
signed long long
або просто
long long
-9223372036854775808 … 9223372036854775807 0x8000000000000000 … 0x7FFFFFFFFFFFFFFFFF 64 bit

Оголошення змінних

Змінні оголошують оператора описи. Оператор опису складається зі специфікації типу та списку імен змінних, розділених комою. Наприкінці обов'язково має стояти крапка з комою.

[модифікатори] специфікатор_типу ідентифікатор [, ідентифікатор] ...

Модифікатори – ключові слова signed, unsigned, short, long.
Специфікатор типу - ключове слово char або int, що визначає тип змінної, що оголошується.
Ідентифікатор – ім'я змінної.

Char x; int a, b, c; unsigned long long y;

При оголошенні змінну можна проініціалізувати, тобто надати їй початкове значення.

Int x = 100;

У змінну x при оголошенні відразу буде записано число 100. Змінні, що ініціалізуються, краще оголошувати в окремих рядках.

Типом даних у програмуванні називають сукупність двох множин: безліч значень та безліч операцій, які можна застосовувати до них. Наприклад, до типу даних цілих невід'ємних чисел, що складається з кінцевої множини натуральних чисел, можна застосувати операції додавання (+), множення (*), цілісного поділу (/), знаходження залишку (%) та віднімання (−).

Мова програмування, зазвичай, має набір примітивних типів даних - типи, надані мовою програмування як базова вбудована одиниця. У C++ такі типи творець мови називає фундаментальними типами. Фундаментальними типами C++ вважаються:

  • логічний (bool);
  • символьний (напр., char);
  • цілий (напр., int);
  • з плаваючою точкою (напр., float);
  • перерахування (визначається програмістом);
  • void.

Поверх перерахованих будуються такі типи:

  • вказівні (напр., int*);
  • масиви (напр., char);
  • посилання (напр., double&);
  • інші структури.

Перейдемо до поняття літерала (напр., 1, 2.4F, 25e-4, 'a' та ін): літерал - запис у вихідному коді програми, що представляє собою фіксоване значення. Іншими словами, літерал - це просто відображення об'єкта (значення) якогось типу в коді програми. У C++ є можливість запису цілих значень, значень з плаваючою точкою, символьних, булевих, рядкових.

Літерал цілого типу можна записати в:

  • 10-й системі числення. Наприклад, 1205;
  • 8-й системі числення у форматі 0 + число. Наприклад, 0142;
  • 16-й системі числення у форматі 0x + число. Наприклад, 0x2F.

24, 030, 0x18 - це записи однієї й тієї числа в різних системах числення.
Для запису чисел з плаваючою точкою використовують запис через точку: 0.1, .5, 4. - або
експонентного запису - 25e-100. Прогалин у такому записі бути не повинно.

Ім'я, з яким ми можемо зв'язати записані літералами значення, називають змінною. Змінна - це названа або адресована іншим способом область пам'яті, адресу якої можна використовувати для доступу до даних. Ці дані записуються, переписуються та стираються у пам'яті певним чином під час виконання програми. Змінна дозволяє в будь-який момент часу отримати доступ до даних та за потреби змінити їх. Дані, які можна отримати на ім'я змінної, називають значенням змінної.
Для того щоб використовувати в програмі змінну, її обов'язково потрібно оголосити, а при необхідності можна визначити (= ініціалізувати). Оголошення змінної у тексті програми обов'язково містить дві частини: базовий тип і декларатор. Специфікатор та ініціалізатор є необов'язковими частинами:

Const int example = 3; // тут const – специфікатор // int – базовий тип // example – ім'я змінної // = 3 – ініціалізатор.

Ім'я змінної є послідовністю символів з літер латинського алфавіту (маленьких і великих), цифр та/або символу підкреслення, однак перший символ цифрою бути не може. Ім'я змінної слід вибирати таким, щоб завжди було легко здогадатися, що вона зберігає, наприклад, «monthPayment». У конспекті та на практиках ми будемо використовувати для правил запису змінних нотацію CamelCase. Ім'я змінної неспроможна збігатися з зарезервованими у мові словами, приклади таких слів: if, while, function, goto, switch та інших.

Декларатор, крім імені змінної, може містити додаткові символи:

  • * - покажчик; перед ім'ям;
  • * const - константний покажчик; перед ім'ям;
  • & - посилання; перед ім'ям;
  • - масив; після імені;
  • () – функція; після імені.

Ініціалізатор дозволяє визначити для змінної значення відразу після оголошення. Ініціалізатор починається з літералу рівності (=) і далі відбувається процес завдання значення змінної. Взагалі, знак рівності C++ позначає операцію присвоювання; з її допомогою можна ставити та змінювати значення змінної. Для різних типів може бути різним.

Специфікатор визначає додаткові атрибути, відмінні від типу. Наведений у прикладі специфікатор const дозволяє заборонити зміну значення змінної. Такі незмінні змінні називають константними чи константою.

Оголосити константу без ініціалізації не вдасться з логічних причин:

Const int EMPTY_CONST; // помилка, не ініціалізована константна змінна const int EXAMPLE = 2; //Константа зі значенням 2 EXAMPLE = 3; // помилка, спроба надати значення константної змінної

Для іменування констант прийнято використовувати лише великі літери, розділяючи слова символом нижнього підкреслення.

Основні типи даних у C++

Розбираючи кожен тип, читач повинен забувати визначення типу даних.

1. Цілочисленний тип (char, short (int), int, long (int), long long)

З назви легко зрозуміти, що багато значень складається з цілих чисел. Також безліч значень кожного з перерахованих типів може бути знаковим (signed) або беззнаковим (unsigned). Кількість елементів, що міститься в багатьох, залежить від розміру пам'яті, яка використовується для зберігання значення цього типу. Наприклад, для змінної типу char приділяється 1 байт пам'яті, тому всього елементів буде:

  • 2 8N = 2 8 * 1 = 256 де N - розмір пам'яті в байтах для зберігання значення

У такому разі діапазони доступних цілих чисел такі:

  • - для беззнакового char
  • [-128..127] - для знакового char

За умовчанням змінна цілого типу вважається знаковою. Щоб зазначити у коді, що змінна має бути беззнаковою, до базового типу зліва приписують ознаку знаковості, тобто. unsigned:

Unsigned long values; // Задає цілий (довгий) беззнаковий тип.

Перелічені типи відрізняються лише розмірами пам'яті, яка потрібна для зберігання. Оскільки мова C++ досить машинно-залежний стандарт мови лише гарантує виконання наступної умови:

  • 1 = розмір char ≤ розмір short ≤ розмір int ≤ розмір long.

Зазвичай розміри типів такі: char - 1, short - 2, int - 4, long -8, long long - 8 байт.

Зі значеннями цілого типу можна здійснювати арифметичні операції: +, -, *, /, %; операції порівняння: ==, !=,<=, <, >, >=; бітові операції: &, |, xor,<<, >>.
Більшість операцій, таких як додавання, множення, віднімання та операції порівняння, не викликають проблем у розумінні. Іноді після виконання арифметичних операцій результат може виявитися за межами діапазону значень; у цьому випадку програма видасть помилку.
Цілочисельне розподіл (/) знаходить цілу частину від розподілу одного цілого числа, на інше. Наприклад:

  • 6 / 4 = 1;
  • 2 / 5 = 0;
  • 8 / 2 = 4.

Символ відсотка (%) означає операцію визначення залишку від поділу двох цілих чисел:

  • 6 % 4 = 2;
  • 10 % 3 = 1.

Більш складні розуміння операції - бітові: & (І), | (АБО), xor (що виключає АБО),<< (побитовый сдвиг влево), >> (Побітовий зсув праворуч).

Бітові операції І, АБО та XOR до кожного біта інформації застосовують відповідну логічну операцію:

  • 1 10 = 01 2
  • 3 10 = 11 2
  • 1 10 & 3 10 = 01 2 & 11 2 = 01 2
  • 1 10 | 3 10 = 01 2 | 11 2 = 11 2
  • 1 10 xor 3 10 = 01 2 xor 11 2 = 10 2

В обробці зображення використовують 3 канали для кольору: червоний, синій та зелений - плюс прозорість, які зберігаються у змінній типу int, т.к. кожен канал має діапазон значень від 0 до 255. У 16-річній системі числення деяке значення записується наступним чином: 0x180013FF; тоді значення 18 16 відповідає червоному каналу, 00 16 - синьому, 13 16 - зеленому, FF - альфа-каналу (прозорості). Щоб виділити з цілого числа певний канал використовують т.зв. маску, де на позиціях, що нас цікавлять, стоять F 16 або 1 2 . Т. е., щоб виділити значення синього каналу необхідно використовувати маску, тобто. побітове І:

Int blue_channel = 0x180013FF & 0x00FF0000;

Після чого отримане значення зсувається праворуч на необхідну кількість біт.

Побітовий зсув зміщує ліворуч або праворуч на стільки двійкових розрядів числа, скільки зазначено в правій частині операції. Наприклад, число 39 для типу char у двійковому вигляді записується в наступному вигляді: 00100111.

Char binaryExample = 39; // 00100111 char result = binaryExample<< 2; // сдвигаем 2 бита влево, результат: 10011100

Якщо змінна беззнакового типу, тоді результатом буде число 156 для знакового воно дорівнює -100. Зазначимо, що з цілих знакових типів одиниця у старшому розряді бітового уявлення - ознака негативності числа. При цьому значення, що в двійковому вигляді складаються з усіх одиниць відповідає -1; якщо ж 1 лише у старшому розряді, а інших розрядах - нулі, тоді таке число має мінімальне для конкретного типу значення: для char це -128.

2. Тип з плаваючою точкою (float, double (float))

Безліч значень типу з плаваючою точкою є підмножиною дійсних чисел, але не кожне речове число представимо в двійковому вигляді, що призводить іноді до дурних помилок:

Float value = 0.2; value == 0.2; // помилка, value тут однаково 0.2.

Працюючи зі змінними з плаваючою точкою, програміст не повинен використовувати операцію перевірки на рівність чи нерівність, натомість зазвичай використовують перевірку на потрапляння у певний інтервал:

Value - 0.2< 1e-6; // ok, подбирать интервал тоже нужно осторожно

Крім операцій порівняння, тип з плаваючою точкою підтримує 4 арифметичні операції, які повністю відповідають математичним операціям з речовими числами.

3. Булевий (логічний) тип (bool)

Складається лише з двох значень: true (правда) і false (брехня). Для роботи зі змінними цього типу використовують логічні операції: ! (НЕ), == (рівність), != (Нерівність), && (логічне І), || (логічне АБО). Результат кожної операції можна знайти у відповідній таблиці істинності. наприклад:

X Y XOR0 0 0 0 1 1 1 0 1 1 1 0

4. Символьний тип (char, wchar_t)

Тип char - як цілий тип (зазвичай, такий тип називають byte), а й символьний, що зберігає номер символу з таблиці символом ASCII . Наприклад, код 0x41 відповідає символу 'A', а 0x71 - 't'.

Іноді виникає необхідність використання символів, які не закріплені в таблиці ASCII і тому потребують зберігання більше 1-го байта. Їх існує широкий символ (wchar_t).

5.1. Масиви

Масиви дозволяють зберігати послідовний набір однотипних елементів. Масив зберігається у пам'яті безперервним блоком, тому не можна оголосити масив, не вказавши його розмір. Щоб оголосити масив після імені змінної пишуть квадратні дужки () із зазначенням його розміру. Наприклад:

Int myArray; // Масив із 5-и елементів цілого типу

Для ініціалізації масиву значення перераховують у фігурних дужках. Ініціалізувати таким чином можна лише під час оголошення змінної. До речі, у цьому випадку необов'язково вказувати розмір масиву:

Int odds = (1, 3, 7, 9, 11); // Масив ініціалізується 5-ма значеннями

Для доступу до певного значення масиву (елемента масиву) використовують операцію доступу за індексом () із зазначенням номера елемента (номери починаються з 0). Наприклад:

Odds; // Доступ до першого елементу масиву. Поверне значення 1 odds; // Доступ до третього елементу. Поверне значення 7 odds = 13; // 5-му елементу масиву присвоюємо нове значення odds; // помилка доступу

5.3. Рядки

Для запису рядка програмісти використовують ідею, що рядок – послідовний ряд (масив) символів. Для ідентифікації кінця рядка використовують спеціальний символ кінця рядка: '\0'. Такі спеціальні символи, що складаються зі зворотного слеша та символу, що ідентифікує, називають керуючими або escape-символами. Ще є, наприклад, '\n' - початок нового рядка, '\t' - табуляція. Для запису в рядку зворотного слеша застосовують екранування перед самим знаком ставлять ще один слеш: '\'. Екранування також застосовують для запису лапок.

Створимо змінну рядки:

Char textExample = ('T', 'e', ​​'s', 't', '\0'); // записано рядок «Test»

Існує спрощений запис ініціалізації рядка:

Char textExample = "Test"; // Останній символ не пишеться, але розмір все ще 5

Не вдаючись до подробиць, наведемо ще один корисний тип даних - string. Рядки
такого типу можна, наприклад, складати:

String hello = "Привіт,"; string name = "Макс!"; string hello_name = hello + name; // Вийде рядок «Привіт, Максе!»

6. Посилання

Inta = 2; // змінна "a" вказує на значення 2 int & b = a; // змінна "b" вказує туди ж, куди і "a" b = 4; // Змінюючи значення b, програміст змінює значення a. Тепер a = 4 int & c = 4; // помилка, робити не можна, т.к. посилання не можна присвоїти значення

7. Покажчик

Щоб розібратися з цим типом даних, необхідно запам'ятати, що безліч значень цього типу - адреси осередків пам'яті, звідки починаються дані. Також покажчик підтримує операції додавання (+), віднімання (-) та розіменування (*).

Адреси 0x0 означає, що покажчик порожній, тобто. не вказує на жодні дані. Ця адреса має свій літерал - NULL:

Int *nullPtr = NULL; // Порожній покажчик

Додавання та віднімання адреси з цілим числом або іншою адресою дозволяє
пересуватись по пам'яті, доступній програмі.

Операція отримання даних, що починаються за адресою, що зберігається в покажчику, називається розіменування (*). Програма зчитує необхідну кількість осередків пам'яті та повертає значення, що зберігається у пам'яті.

Int valueInMemory = 2; // задаємо зміну цілого типу int * somePtr = // копіюємо адресу змінної, тут & - повертає адресу змінної somePtr; // адреса осередку пам'яті, наприклад, 0x2F * somePtr; // значення зберігається в 4-х осередках: 0x2F, 0x30, 0x31 та 0x32

Для покажчиків не доступна операція присвоєння, яка синтаксично збігається з операцією копіювання. Інакше кажучи, можна скопіювати адресу іншого покажчика чи адресу змінної, але визначити значення адреси самому не можна.

Сам покажчик зберігається у пам'яті, як значення змінних інших типів, і займає 4 байти, тому можна створити покажчик на покажчик.

8. Перерахування

Перерахування єдиний базовий тип, що задається програмістом. За великим рахунком перерахування - впорядкований набір іменованих цілих констант, причому ім'я перерахування буде базовим типом.

Enum color (RED, BLUE, GREEN);

За умовчанням, RED = 0, BLUE = 1, GREEN = 2. Тому значення можна порівнювати між собою, тобто. RED< BLUE < GREEN. Программист при объявлении перечисления может самостоятельно задать значения каждой из констант:

Enum access (READ = 1, WRITE = 2, EXEC = 4);

Часто зручно використовувати перерахування, значення є ступенем двійки, т.к. у двійковому поданні число, що є ступенем 2-ї, складатиметься з 1-ї одиниці та нулів. Наприклад:

8 10 = 00001000 2

Результат додавання цих чисел між собою завжди однозначно вказує на те, які числа складалися:

37 10 = 00100101 2 = 00000001 2 + 00000100 2 + 00100000 2 = 1 10 + 4 10 + 32 10

Void

Синтаксично тип void відноситься до фундаментальних типів, але використовувати його можна як частину складніших типів, т.к. об'єктів типу void немає. Як правило, цей тип використовується для інформування про те, що у функції немає значення, що повертається або як базовий тип покажчика на об'єкти невизначених типів:

Void object; // помилка, немає об'єктів типу void void // помилка, немає посилань на void void *ptr; // ok, зберігаємо покажчик на невідомий тип

Часто ми будемо використовувати void для позначення того, що функція не повертає ніякого значення. З покажчиком типу void працюють, коли програміст бере на себе турботу про цілісність пам'яті і правильному приведенні типу.

Приведення типів

Часто необхідно привести значення змінної одного типу до іншого. У разі коли безліч значень вихідного типу є підмножиною більшого типу (наприклад, int є підмножиною long, а long - double), компілятор здатний неявно ( implicitly) змінити тип значення.

Int integer = 2; float floating = integer; // floating = 2.0

Зворотне приведення типу буде виконано з втратою інформації, так від числа з точкою, що плаває, залишиться тільки ціла частина, дробова буде втрачена.

Існує можливість явного (explicitly) перетворення типів, для цього ліворуч від змінної або будь-якого значення вихідного типу в круглих дужках пишуть тип, до якого буде зроблено приведення:

Int value = (int) 2.5;

Унарні та бінарні операції

Ті операції, які ми виконували раніше, називають бінарними: ліворуч та праворуч від символу операції знаходяться значення або змінні, наприклад, 2 + 3. У мовах програмування крім бінарних операцій також використовують унарні операції, які застосовуються до змінних. Вони можуть перебувати як зліва, так і праворуч від змінної, кілька таких операцій зустрічалися раніше - операція розіменовування (*) і взяття адреси змінної (&) є унарними. Оператори «++» і «—» збільшують і зменшують значення цілісної змінної на 1 відповідно, причому можу писатися або ліворуч, або праворуч від змінної.

У C++ також застосовується скорочена запис бінарних операцій на той випадок, коли в лівій та правій частинах виразу знаходиться та сама змінна, тобто. виконується якась операція зі значенням змінної і результат операції заноситься до тієї ж змінної:

A + = 2; // те саме, що й a = a + 2; b / = 5; // те саме, як і b = b / 5; c &= 3; // те саме, що і c = c & 3;