У попередньому розділі ми дізналися, що змінні використовуються для зберігання даних у програмі. Кожна змінна в мові C повинна мати визначений тип даних, який вказує, які саме значення вона може зберігати. Наприклад, один тип даних призначений для цілих чисел, інший — для чисел із дробовою частиною, а ще один — для окремих символів.
Тип даних також визначає, скільки пам'яті буде виділено для змінної та які операції можна виконувати з її значенням. Завдяки цьому компілятор знає, як правильно обробляти дані під час виконання програми.
Основними типами даних, які використовуються в програмах на мові Сі є int, float, double і char.
Основні типи даних мови C
Цілі числа - тип даних int
Змінні цього типу можуть зберігати додатні і від'ємні числа. Зазвичай на таку змінну виділяється 4 байти оперативної пам’яті (але розмір може залежати від системи). Приклад створення і використання такої змінної:
int myNum; // створюємо змінну, за замовчуванням вона матиме значення - нульmyNum = 1000; // тепер цій змінній задаємо значення 1000myNum = -134; // також можна записати від'ємне числоmyNum = 0; // або нуль
Вивід значень змінних типу int
В мові C для виводу значень в консоль використовуються специфікатори формату. Це спеціальна комбінація знаків в тексті для виводу, яка вказує куди вставити значення і визначає формат його відображення, наприклад:
int speed = 124; // створюємо зміннуprintf("Швидкість: %d км/год", speed); // вставимо в текст і виведемо на екран
В результаті код виведе в консоль текст "Швидкість: 124 км/год"
Як видно з прикладу, для виводу значення змінної необхідно в дужках команди printf після тексту (через кому) вказати назву змінної, значення якої треба вставити в текст. В самому тексті вписується специфікатор - %d і на його місце буде вставлено значення змінної. Зверніть увагу, що кожен тип даних має свій специфікатор, для цілих чисел це %d.
Можливо також виводити в одному тексті декілька значень одночасно:
int weight = 76;int height = 178;printf("Вага: %d кг, зріст: %d см", weight, height);
Для цього в рядку вкажіть специфікатори і через кому назви змінних. Обов'язково зберігайте порядок змінних відповідно специфікаторів, вказаних в тексті.
Дробні числа - типи даних float та double
У мові C, крім цілих чисел, часто потрібно працювати з числами, які мають дробову частину. Для цього використовуються типи даних float і double, які часто називають типами для чисел з плаваючою комою. Така назва походить від способу їх зберігання в пам'яті комп'ютера. На відміну від цілих чисел, десяткова кома в таких числах може умовно "переміщуватися", що дозволяє зберігати як дуже великі, так і дуже малі значення. Наприклад, числа 1234.5, 0.00123 і 1230000.0 можуть бути представлені одним і тим самим способом, змінюючи лише положення коми.
Вони потрібні там, де цілих чисел недостатньо — наприклад, у розрахунках швидкості, ваги, відстані, температури або будь-яких наукових обчисленнях.
Тип float використовується для зберігання дробових чисел і створюється таким чином:
float temperature = 36.6f;float speed = 12.5f;
float підходить для випадків, де не потрібна дуже висока точність дробової частини числа, але важлива економія пам’яті або швидкість обчислень. Кожна змінна займає 4 байта пам'яті.
Тип double також використовується для дробових чисел, але має подвійну точність. Він займає більше пам’яті (зазвичай 8 байтів) і дозволяє зберігати числа з більшою кількістю знаків після коми. Приклад:
double pi = 3.1415926535;double distance = 12345.6789;
double використовується там, де важлива точність розрахунків, наприклад у фізиці, математиці або фінансових обчисленнях.
Різниця між float і double
Головна різниця між цими типами полягає у точності та розмірі пам’яті. Точність значення з плаваючою комою показує, скільки цифр може мати число після десяткової крапки. Точність типу float становить шість або сім десяткових цифр, тоді як змінні типу double мають точність приблизно 15 цифр. Тому для більшості обчислень часто безпечніше використовувати double — але варто враховувати, що він займає вдвічі більше пам’яті, ніж float (8 байт проти 4).
Важливий момент. Дробові числа в C зберігаються не абсолютно точно, а з певною похибкою. Це означає, що іноді результати обчислень можуть трохи відрізнятися від очікуваних значень — це нормальна особливість роботи з числами з плаваючою комою.
Вивід float і double в консоль
Ці типи мають специфікатори формату %f та %lf відповідно. Приклад виводу:
float weight = 73.56f;double height = 1.76;printf("Вага: %f\n");printf("Зріст: %lf\n");
Цей код виведе текст:
Вага: 73.560000
Зріст: 1.760000
Налаштування точності десяткових чисел
Ти, мабуть, вже помітив, що якщо вивести число з плаваючою комою, у результаті буде показано багато цифр після десяткової крапки, наприклад:
float myFloatNum = 3.5f;double myDoubleNum = 19.99;printf("%f\n", myFloatNum); // Виведе 3.500000printf("%lf", myDoubleNum); // Виведе 19.990000
Якщо ти хочеш прибрати зайві нулі (тобто налаштувати точність виводу), в специфікаторі можна використати крапку (.), після якої вказується число, що визначає кількість цифр після десяткової крапки, які потрібно відобразити:
float myFloatNum = 3.5f;printf("%f\n", myFloatNum); // За замовчуванням буде показано 6 цифр після десяткової крапкиprintf("%.1f\n", myFloatNum); // Показати лише 1 цифруprintf("%.2f\n", myFloatNum); // Показати лише 2 цифриprintf("%.4f", myFloatNum); // Показати лише 4 цифри
У специфікаторі формату число після крапки визначає, скільки цифр буде виведено після десяткової крапки. Це дозволяє зробити вивід більш компактним і зручним для читання. Наприклад, %.2f виведе число з точністю до двох знаків після десяткової крапки.
Символьний тип даних - char
Тип даних char використовується для зберігання одного символу і займає 1 байт пам'яті. Символ повинен бути взятий в одинарні лапки, наприклад 'A' або 'c', а для його виведення використовується специфікатор формату %c:
char grade = 'A';printf("%c", grade);
Кожен символ має числовий код у таблиці ASCII. Тому змінній типу char можна присвоїти не лише символ у лапках, а й його числовий код. Оскільки код символу є числом, лапки не використовуються:
char a = 65, b = 66, c = 67;printf("%c", a);printf("%c", b);printf("%c", c);
За необхідності повну таблицю кодів ASCII можна легко найти в інтернеті.
Примітки про символи (char)
Якщо ти спробуєш зберегти більше ніж один символ у змінну типу char, вона збереже і виведе лише останній символ: Приклад:
char myText = 'Hello'; // збереже лише oprintf("%c", myText); // виведе, відповідно o
У цьому випадку в змінну myText фактично потрапить лише останній символ 'o', тому саме він і буде виведений.
Важливо: не використовуй тип char для зберігання кількох символів (рядків), оскільки це може призвести до помилок. Для цього існують рядки (масиви char).
Для зберігання кількох символів (або цілих слів) використовуються рядки (strings), з якими ти детальніше познайомишся в наступних розділах:
char myText[] = "Hello";printf("%s", myText);
Поки що просто запам’ятай: для зберігання кількох символів або тексту використовуються рядки (strings), а тип char — для одного символу.
Оператор sizeof у C
Зверни увагу, що для виведення результату ми використовуємо специфікатор формату %zu замість %d. Це пов’язано з тим, що оператор sizeof повертає значення типу size_t, який є беззнаковим цілим типом. На деяких комп’ютерах може працювати і %d, але більш безпечно та переносимо (portable) використовувати %zu, оскільки він спеціально призначений для виведення значень типу size_t.
Навіщо знати розмір типів даних?
Знання розміру типів даних допомагає зрозуміти, скільки пам’яті використовує твоя програма. Це особливо важливо при створенні великих програм або роботі з обмеженою пам’яттю, оскільки це може впливати як на продуктивність, так і на ефективність.
Наприклад, тип char займає 1 байт. Це означає, що якщо ти маєш масив із 1000 значень char, він займе 1000 байтів (1 КБ) пам’яті.
Використання правильного типу даних для відповідної задачі дозволяє економити пам’ять і покращувати продуктивність програми.
Ти детальніше познайомишся з оператором sizeof пізніше в цьому навчальному матеріалі, а також з тим, як використовувати його в різних ситуаціях.
Приклад використання різних типів даних
Ось приклад підрахунку і виводу на екран вартості товарів з використанням різних типів даних:
// Створимо змінні різних типів
int items = 50; // кількість одиниць товару
float cost_per_item = 9.99f; // ціна за 1 шт.
float total_cost = items * cost_per_item; // загальна вартість
char currency = '$'; // знак валюти
// Вивести на екран
printf("Кількість одиниць товару: %d\n", items);
printf("Ціна за штуку: %.2f %c\n", cost_per_item, currency);
printf("Загальна вартість = %.2f %c\n", total_cost, currency);
Розширення типів даних у C
Базових типів даних (int, float, double, char) часто достатньо для більшості програм. Проте іноді потрібно зберігати дуже великі числа, економити пам'ять або працювати лише з додатними значеннями. Для цього в C існують модифікатори типів.
Модифікатори змінюють властивості базового типу, наприклад його розмір або діапазон допустимих значень.
short
Модифікатор short створює скорочену версію типу int, яка зазвичай займає менше пам'яті.
short int age = 25;
Зазвичай short використовується тоді, коли великі числа не потрібні і важливо економити пам'ять.
long
Модифікатор long дозволяє зберігати більші цілі числа, ніж звичайний int.
long int population = 800000000;
Для ще більших значень існує тип long long:
long long int distance = 9876543210;
unsigned
За замовчуванням цілі типи можуть зберігати як додатні, так і від'ємні числа. Модифікатор unsigned забороняє від'ємні значення, але натомість збільшує максимальне додатне число, яке можна зберегти.
unsigned int score = 100;
Оскільки пам'ять більше не витрачається на зберігання від'ємних чисел, весь діапазон використовується для додатних значень і нуля.
Комбінування модифікаторів
Модифікатори можна поєднувати між собою:
unsigned short int count = 500;
unsigned long int population = 4000000000;
unsigned long long int stars = 18000000000000000000ULL;
Такі комбінації дозволяють підібрати тип даних під конкретну задачу.
Важливе зауваження! Точний розмір типів short, int і long залежить від компілятора та платформи. Наприклад, long може займати 4 байти на одній системі і 8 байтів на іншій. Якщо потрібно дізнатися фактичний розмір типу на твоєму комп'ютері, скористайся оператором sizeof.
Ця стаття з циклу статей Уроки програмування на мові C.
Наступний урок в процесі написання...
