Стаття урок 7 з
Отже, для того, щоб вказати тип даних, використовуємо специфікатор типу - одне або кілька ключових слів, що визначають тип оголошується змінної. У мові СІ є стандартний набір типів даних, використовуючи який можна сконструювати нові (унікальні, призначені для користувача) типи даних. Про це мова буде пізніше, поки що розберемо стандартні типи.
Цілі типи: int, char, short, long.
Плаваючі типи: float, double.
Якщо ви напишете тільки signed або unsigned і надалі не поставите більше ніякого ключового слова (відразу буде йти ідентифікатор змінної), то така змінна буде розглядатися як змінна типу int.
int c; (Мається на увазі signed int c);
unsigned d; (Мається на увазі unsigned int d);
signed f; (Мається на увазі signed int f).
Для визначення даних цілого типу використовуються різні ключові слова, які визначають діапазон значень і розмір області пам'яті, що виділяється під змінні (табл.). Відзначте для себе, що одні й ті ж типи даних на різних машинних платформах можуть займати різний обсяг пам'яті.
Розмір пам'яті в байтах
від 0 до 4 294 967 295
Розмір пам'яті для змінної з модифікатором типу signed int визначається довжиною так званого машинного слова, яке має різний розмір на різних машинах. Так, на 16-ти розрядних машинах розмір слова дорівнює 2-м байтам, на 32-х розрядних машинах відповідно 4-м байтам, тобто тип int еквівалентний типам short int. або long int в залежності від архітектури використовуваної ПЕОМ. Так крім того, розмір в байтах залежить ще від операційної системи і навіть від компілятора. Таким чином, одна і та ж програма може правильно працювати на одному комп'ютері і неправильно на іншому. (.) Єдине, що гарантовано мовою, це те, що short <= int <= long.
Зрозуміло, що вся ця плутанина великого ентузіазму не викликає Можна тільки порадіти тому, що нам дещо легше: вже є стандарти мови. А в момент створення С, коли не було взагалі ніякої стандартизації, в розмірах була ще велика плутанина. Щоб уникнути того факту, коли через розбіжності розмірів типів даних програма може працювати на одному комп'ютері і не працювати на іншому, була придуманий спеціальний оператор, який може визначити довжини пам'яті займаної змінної: sizeof ().
Працює він під час компілювання, а не під час виконання програми, так що компілятор просто підставляє замість нього відповідне число-розмір змінної в байтах на вашому комп'ютері, у вашій операційній системі і з вашим компілятором. Користуватися їй просто: в дужках ви вказуєте ім'я змінної, чий розмір в байтах хотіли б отримати. Припустимо, ви визначили змінну х типу int. Визначимо її розмір в байтах і виведемо його НЕ екран:
int x;
2. Дані плаваючого типу Змінні, що представляють число з плаваючою точкою, тобто, що представляють собою десяткову дріб. Величина зі специфікатором типу float займає 4 байта. Величина типу double займає 8 байт в пам'яті. Є ще тип long double. Біда, правда, в тому, що у нього різні розміри на різних компіляторах, а в деяких він взагалі відсутній.
3. Перетворення типів при обчисленні виразів
Ну ось ми познайомилися з типами даних. Тепер варто розглянути, що ж відбувається, якщо в одній і тій же операції беруть участь змінні різних типів.
При виконанні математичних операцій проводиться автоматичне перетворення типів, щоб привести операнди виразів до загального типу або щоб розширити короткі величини до розміру цілих величин, використовуваних в машинних командах. Виконання перетворення залежить від специфіки операцій і від типу операнда або операндів.
Розглянемо загальні перетворення двох операндів різного типу в одному арифметичному операторі: в цьому випадку менший перетвориться до більшого. Тут під "меншим" розуміється тип з меншою абсолютною величиною максимального допустимого значення (тобто long буде менше, ніж float). "Найбільший розмір" типу даних визначається не кількістю займаних байт, а верхньою межею діапазону представимо значень. Т.ч. unsigned виходить більше, ніж int. а float - більше, ніж long.
unsigned char ch;
unsigned long in;
Опис прикладу: при виконанні оператора присвоювання правила перетворення будуть виконуватися в такий спосіб. Операнд ch перетворюється в кінцевому рахунку до типу unsigned long. За цим же правилом i перетворюється до unsigned long і результат операції, укладеної в круглі дужки матиме тип unsigned long. Потім він перетвориться до типу double і результат всього виразу матиме тип double.
- Ціле зі знаком перетвориться до коротшого цілому зі знаком. з втратою інформації: все розряди числа, які знаходяться вище (або, відповідно - нижче) межі, що визначає максимальний розмір змінної.
- Ціле зі знаком перетвориться до більш довгому цілому зі знаком. Шляхом розмноження знака. Що це таке? Всі додані біти двійкового числа будуть зайняті тим же числом, яке знаходилося в знаковому біті: якщо число було позитивним, то це буде, відповідно 0, якщо негативним - 1.
- Ціле зі знаком до цілого без знака: першим кроком ціле зі знаком перетвориться до цілого зі знаком, що відповідає цільовому значенню - тобто, того, до якого наводимо - (якщо цільової тип даних крупніше). У отриманого значення символ не відкидається, а просто все біти вважаються звичайними, в тому числі і знаковий.
- Перетворення цілого зі знаком до плаваючого типу відбувається без втрати інформації, за винятком випадку перетворення типу long int або unsigned long int до типу float. коли точність часто може бути втрачена.
2. Перетворення цілих типів без знака.
- Ціле без знака перетворюється до коротшого цілому без знака або зі знаком шляхом усічення.
- Ціле без знака перетворюється до більш довгому цілому без знака або зі знаком шляхом додавання нулів зліва.
- Ціле без знака перетворюється до цілого зі знаком того ж розміру. Якщо взяти для прикладу, unsigned short і short - числа в діапазоні 32768-65535 перетворяться в негативні.
- Ціле без знака перетворюється на змінний типу. Спочатку воно перетвориться до значення типу signed long. яке потім перетворюється в плаваючий тип.
3. Перетворення плаваючих типів.
- Величини типу float перетворюються до типу double без зміни значення.
- Величини double перетворюються до float c деякою втратою точності, тобто, кількості знаків після коми. Якщо значення занадто велике для float. то відбувається втрата значущості, про що повідомляється під час виконання.
- При перетворенні величини з плаваючою точкою до цілим типам вона спочатку перетворюється до типу long (дрібна частина плаваючою величини при цьому відкидається), а потім величина типу long перетвориться до необхідного цілого типу. Якщо значення занадто велике для long. то результат перетворення не визначений. Зазвичай це означає, що на розсуд компілятора може вийти будь-яке сміття. У реальній практиці з такими перетвореннями зазвичай стикатися не доводиться.
У цих випадках перетворення типу в тип носять неявний характер, тобто, виконуються компілятором і будь-які повідомлення про те, що такий-то тип наводиться до такого-то відсутні. Хоча деякі компілятори все ж повідомляють про неявних перетвореннях, що призводять до втрати точності або усічення. Неявне приведення типів виникає при виконанні операцій привласнення, якщо значення одного типу присвоюється змінної іншого типу.
Крім того, в Сі є можливість явного приведення значення одного типу до іншого. Для цього існує операція приведення типів. яка пишеться так: (ім'я-типу) операнд, де ім'я-типу задає тип, до якого повинен бути перетворений операнд.
В даному прикладі величини i, l, d будуть явно перетворюватися до вказаних в круглих дужках типам.