ОСНОВНІ ТИПИ ДАНИХ ТА ЇХ ВНУТРІШНЕ ПРЕДСТАВЛЕННЯ

Змінні та константи

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

До скалярних відносять арифметичні типи, перерахування, покажчики, тип посилань (reference type). До агрегованих типів відносять масиви, структури та об'єднання та класи.

Крім того, типи можуть бути розділені на основні (фундаментальні) та похідні (derived). До основних типів відносять void, char, int, float, і double разом з варіантами short, long, signed і unsigned, що застосовуються до деяких з них.

У С++ є набір основних типів, які відповідають найбільш загальним основним одиницям пам'яті комп'ютера та найбільш загальним основним способам їх використання:

char, short int, int, long int для подання різних розмірів;

float, double для представлення чисел із плаваючою точкою;

unsigned char, unsigned short int, unsigned int, unsigned long int подання беззнакових цілих, логічних значень, бітових масивів тощо.

Похідні типи - це покажчики та посилання інші типи, масиви, функції, класи, структури та об'єднання.

Дані типу int

Тип «ціле» (integer) включає дані типу char, short, int І long разом із їхніми варіантами signed і unsigned. Дані типу int (змінні та константи) можуть бути в одній з таких можливих форм, зазначених у табл.1.

Дані типу int длякомпілятор Borland C++ 3.1

Відповідно до таблиці, short int і int є синонімами. Синонімами є типи unsigned int та unsigned.

Мова С++ підтримує IEEE – стандарт внутрішнього уявлення даних типу int (рис.1).

S – знаковий розряд числа

Рис.1. IEEE – стандарт внутрішнього подання даних типу int

У комп'ютері з 16-ти розрядним процесором дані типу int займають 2 байти пам'яті (машинне слово), дані типу long займають 4 ба. Старший біт знакових типів int, short int, long int зберігає знак числа. Якщо він дорівнює нулю, число позитивне, якщо дорівнює одиниці – число негативне. Позитивні числа зберігаються у пам'яті і входять у операції у прямому коді, тобто. у звичайному двійковому поданні числа. Негативні числа зберігаються у пам'яті комп'ютера у додатковому коді. Наведемо правило отримання додаткового коду:

модуль від'ємного числа записується в прямому коді в бітах 14-0 або 30-0 "притиснутим" праворуч. У старші біти, що не використовуються, записуються нулі;

у знаковий розряд біт 15 або 31 записується 1;

формується зворотний код бітів 14-0 чи 30-0; при цьому нуль замінюється одиницею, а одиниця нулем;

до зворотного коду числа додається одиниця.

Наприклад, зворотний код числа –33 у форматі int:

Константи типу int можуть задаватися в десятковій, вісімковій та шістнадцятковій системі числення. Ознакою константи в шістнадцятковій системі числення є 0х (0Х) як перші її символи. Запис такої константи може містити цифри від 0 до 9, і навіть символи шістнадцяткових цифр A-F. Будь-яка константа, що починається з нуля, розглядається компілятором як задана у вісімковій системі числення.

Якщо у записі константи зустрічаєтьсясуфікс L (l), компілятор інтерпретує константу як long. Суфікс U(u) явно вказує на константу типу unsigned. Дозволяється комбінувати обидва суфікси в будь-якому порядку, наприклад 976LU.

За відсутності суфіксів L(l) або U(u) точний тип константи визначається її запису (табл.2). Негативні константи виходять застосуванням операції "унарний мінус" до відповідної позитивної константи.

Змінна типу int оголошується з допомогою ключових слів unsigned, int, short, long. Синонімами будуть поєднання ключових слів: signed int та int; unsigned int та unsigned; short, sort int і signed short int; unsigned short та unsigned short int; long, long int і signed long int; unsigned long і unsigned long int.

При описі змінної може бути задано початкове значення. Наприклад:

int i=0xabcd, j=04567, k=1;

Цілі константи та їх тип за відсутності суфіксів для компілятора

Якщо описі опущений тип, він передбачається int. Наприклад:

всі визначають об'єкт типу int.

Дані типу char

Дані типу char займають у пам'яті 1 байт. Код від 0 до 255 у цьому байті задає один із 256 можливих символів. Закріплення конкретних символів за кодами визначається так званими кодовими таблицями. Для персональних комп'ютерів найпоширеніша ASCII-таблиця.

Тип char є типом ціле. Дані типу char можуть розглядатися компілятором як дані зі знаком (signed char), і як дані без знака (unsigned char).

Якщо тип char розглядається як signed, то старший біт коду визначає знак. У випадку unsigned char всі вісім біт розглядаються як код, а діапазон можливих значень від 0 до 255.

Константа типу char є символом укладеним в одиночні лапки,наприклад 'A', '$'. Внутрішній код байта, що відповідає константі, визначається за кодовою таблицею.

Подання групи символьних констант описано в параграфі 2.5.3.

Змінна типу char займає 1 байт пам'яті та описується з використанням ключового слова char. При описі змінної можна задати початкове значення. Наприклад:

char symbol='\0100'; /* велика латинська P */

char name='0', first='\n';

Дані з плаваючою точкою

Мова Borland C++ підтримує операції з плаваючою точкою. Особливістю персональних комп'ютерів IBM PC є у системі команд мікропроцесора Intel, з урахуванням яких побудовані, операцій над числами з плаваючою точкою. Такі арифметичні операції виконує або спеціальний співпроцесор математики з плаваючою точкою (співпроцесори 8087/80287/80387), або за його відсутності спеціальні стандартні підпрограми (програмна емуляція співпроцесора).

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

Дані з плаваючою точкою для компілятора Borland C++ 3.1

Borland C++ підтримує IEEE-стандарт, відповідно до якого такі дані подаються у вигляді двох частин – мантиси М та порядку Р числа у двійковій системі числення:

Число біт для зберігання мантиси та порядку залежить від типу даних з плаваючою точкою (рис. 2).

S – символ числа (0 – для позитивних, 1 – для негативних);

Р – зрушений порядок числа;

М - мантіса числа.

Мал. 2. IЕЕЕ-стандарт внутрішнього подання даних з плаваючою точкою.

Речовище в пам'яті зберігається з нормалізованою мантисою. При порушенні нормалізації мантису зрушують вліво доти, доки старшою цифрою мантисине стане 1. Кожна операція зсуву супроводжується зменшенням порядку на 1. Але якщо мантіса завжди нормалізована, то старшу одиницю можна і не зберігати у пам'яті. Це заощаджує один біт і, отже, підвищує точність уявлення дійсних чисел. Ця одиниця є неявно і називається неявною одиницею (implicit one). Відкидання старшої цифри мантиси виконується для форматів float та double, але не виконується для long double.

Порядок числа зберігається "зрушеним", тобто до нього додається число так, щоб порядок був завжди невід'ємним. Для чисел формату float додається 127, для чисел формату double – 1023, для чисел формату long double –16383. Завжди невід'ємний порядок позбавляє необхідності виділяти один біт для зберігання знака порядку та спрощує виконання операцій порівняння порядків та арифметичних операцій над ними.

Наприклад, число 15.375 (1111.011 у двійковій системі числення) у форматі float IEEE-стандарту записується так:

Враховуючи відкидання неявної одиниці та зсув порядку, отримуємо внутрішнє уявлення числа:

Р = 3 +127 = 130 (1000.0010 у двійковій системі числення);

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

Причина того, що представляється більш ніж один цілий тип, більш ніж один беззнаковий тип і більш ніж один тип з плаваючою точкою, щоб дати можливість програмісту скористатися характерними особливостями апаратного забезпечення. На багатьох машинах між різними різновидами основних типів існують значні відмінності у потребах у пам'яті, часах доступу до пам'яті та часах обчислень. Розміри типів не вказані у стандарті мови, а залежать від операційної системи, компілятора тарозрядності процесора. У комп'ютерах із 16-ти розрядними процесорами int – 2 байти, у комп'ютерах із 32-х розрядними процесорами – 4 байти тощо. У стандарті мови С++ вказані такі співвідношення щодо розмірів основних типів: