Розмір типу unsigned short c. Типи даних

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

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

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

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, тому що кожне ім'я буде більшим, ніж попереднє.

Останнє оновлення: 17.09.2017

Кожна змінна має певний тип. І цей тип визначає, які значення може мати змінна, які операції з нею можна робити і скільки байт у пам'яті вона займатиме. У мові 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 до 65535 (при 2 байтах), або від 0 до 4294967295 (для 4 байт)

    char16_t : представляє один символ у кодуванні Unicode. Займає в пам'яті 2 байти (16 біт). Може зберігати будь-яке значення з діапазону від 0 до 65535

    char32_t : представляє один символ у кодуванні Unicode. Займає в пам'яті 4 байти (32 біти). Може зберігати будь-яке значення з діапазону від 0 до 4294967295

    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 байтах) або від -2147483648 до 2147483647 (при 4 байтах). Але в будь-якому випадку розмір повинен бути більшим або дорівнює розміру типу short і менше або дорівнює розміру типу long

    Цей тип має синоніми signed int і signed .

    unsigned int : представляє ціле позитивне число. Залежно від архітектури процесора може займати 2 байти (16 біт) або 4 байти (32 біти), і через це діапазон граничних значень може змінюватися: від 0 до 65535 (для 2 байт), або від 0 до 4294967295 (Для 4 байт).

    Як синонім цього типу може використовуватися unsigned

    long : представляє ціле число в діапазоні від -2147483648 до 2147483647. Займає в пам'яті 4 байти (32 біта).

    Цей тип також має синоніми long int , signed long int і signed long

    unsigned long : представляє ціле число в діапазоні від 0 до 4294967295. Займає в пам'яті 4 байти (32 біта).

    Має синонім unsigned long int.

    long long : представляє ціле число в діапазоні від −9223372036854775808 до +9223372036854775807. Займає в пам'яті, як правило, 8 байт (64 біта).

    Має синоніми long long int, signed long long int і signed long long.

    unsigned long long : представляє ціле число в діапазоні від 0 до 18446744073709551615. Займає в пам'яті, як правило, 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 : тип без значення

Таким чином, всі типи даних за винятком void можуть бути розділені на три групи: символьні (char, wchar_t, char16_t, char32_t), цілочисленні (short, int, long, long long) і типи чисел з плаваючою точкою (float, double, long double).

Символьні типи

Для представлення символів у додатку використовуються типи char, wchar_t, char16_t та char32_t.

Визначимо кілька змінних:

Char c = "d"; wchar_t d = "c";

Змінна типу char як значення приймає один символ в одинарних лапках: char c = "d". Також можна присвоїти число із зазначеного вище у списку діапазону: char c = 120 . У цьому випадку значенням змінної c буде символ, який має код 120 в таблиці символів ASCII.

Варто враховувати, що для виведення на консоль символів wchar_t слід використовувати не std::cout, а потік std::wcout :

#include int main() ( char a = "H"; wchar_t b = "e"; std::wcout<< a << b << "\n"; return 0; }

У цьому потік std::wcout може працювати з char, і з wchar_t. А потік std::cout для змінної wchar_t замість символу виводитиме його числовий код.

У стандарті С++11 були додані типи char16_t і char32_t, які орієнтовані використання Unicode. Однак на рівні ОС поки не реалізовано потоків для роботи з цими типами. Тому якщо потрібно вивести на консоль значення змінних цих типів, необхідно перетворити змінні до типів char або wchar_t:

#include int main() ( char a = "H"; wchar_t b = "e"; char16_t c = "l"; char32_t d = "o"; std::cout<< a << (char)b << (char)c << (char)d << "\n"; return 0; }

В даному випадку при виведенні перед змінними вказується операція приведення до типу char - (char), завдяки чому значення змінних b, c і d перетворюються на тип char і можуть бути виведені на консоль за допомогою потоку std::cout.

Цілочисленні типи

Цілочисленні типи представлені такими типами: short, unsigned short, int, unsigned int, long, unsigned long, long long і unsigned long long:

Short a = -10; unsigned short b = 10; int c = -30; unsigned int d = 60; long e = -170; unsigned long f = 45; long long g = 89;

Типи чисел з плаваючою точкою

Типи чисел з плаваючою точкою або дробові числа представлені такими типами як float , double і long double :

Float a = -10.45; double b = 0.00105; long double c = 30.890045;

Розміри типів даних

У наведеному вище списку для кожного типу вказаний розмір, який він займає в пам'яті. Однак варто відзначити, що граничні розміри для типів розробники компіляторів можуть вибирати самостійно, виходячи з апаратних можливостей комп'ютера. Стандарт встановлює лише мінімальні значення, які мають бути. Наприклад, для типів int і short мінімальне значення - 16 біт, типу long - 32 біта, типу long double. При цьому розмір типу long повинен бути не меншим за розмір типу int, а розмір типу int - не менше розміру типу short, а розмір типу long double повинен бути більшим за double. Наприклад, компілятор g++ під Windows для long double використовує 12 байт, а компілятор, вбудований у Visual Studio і працює під Windows, для long double використовує 8 байт. Тобто навіть у межах однієї платформи різні компілятори можуть по-різному підходити до деяких типів даних. Але загалом застосовуються ті розміри, які вказані вище при описі типів даних.

Проте бувають ситуації, коли потрібно точно знати розмір певного типу. І для цього С++ є оператор sizeof() , який повертає розмір пам'яті в байтах, яку займає змінна:

#include int main() ( long double number = 2; std::cout<< "sizeof(number) =" << sizeof(number); return 0; }

Консольний висновок при компіляції g++:

sizeof(number) = 12

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

Unsigned short number = -65535;

Компілятор G++ при компіляції програми з цим рядком видасть помилку про те, що значення -65535 не входить до діапазону допустимих значень для типу unsigned short і буде усічено.

У Visual Studio компіляція може пройти без помилок, проте змінна number отримає значення 2 - результат перетворення числа -65535 до типу unsigned short. Тобто знову ж таки результат буде не зовсім той, який очікується. Значення змінної - це лише набір бітів у пам'яті, які інтерпретуються відповідно до певного типу. І для різних типів той самий набір бітів може інтерпретуватися по-різному. Тому важливо враховувати діапазони значень того чи іншого типу при присвоєнні змінної значення.

Специфікатор auto

Іноді буває важко визначити тип виразу. І згідно з останніми стандартами можна надати компілятору самому виводити тип об'єкта. І для цього застосовується специфікатор auto. При цьому якщо ми визначаємо змінну зі специфікатором auto, ця змінна має бути обов'язково ініціалізована будь-яким значенням:

Auto number = 5;

На підставі значення компілятор виведе тип змінної. Неініціалізовані змінні зі специфікатором auto не допускаються.

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

При динамічній типізації змінна зв'язується з типом на час ініціалізації. Виходить, що змінна різних ділянках коду може мати різні типи. Динамічну типізацію підтримують Java Script, Python, Ruby, PHP.

Статична типізація є динамічною протилежністю. При оголошенні змінна отримує тип, який змінюється надалі. Мови Сі та Сі++ є саме такими. Цей спосіб найбільш зручний для написання складного коду, але в стадії компіляції виключається багато помилок.

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

x = 1 + "2"; //помилка - не можна додати до символьний знак

Приклад слабкої типізації.

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

Класи пам'яті

Змінні, незалежно від їх типу, мають свою область видимості та час існування.

Класи пам'яті:

  • auto;
  • static;
  • extern;
  • register.

Усі змінні у мові Сі за умовчанням є локальними. Вони можуть використовуватися лише усередині функції або блоку. Після завершення функції їхнє значення знищується.

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

Зовнішня змінна є глобальною. Вона доступна у будь-якій частині коду і навіть в іншому файлі.

Специфікатори типів даних Сі можуть не вказуватися в таких випадках:

  1. Усі змінні всередині блоку є змінними, відповідно, якщо передбачається використання саме цього класу пам'яті, то специфікатор auto не вказується.
  2. Всі функції, оголошені поза блоком або функцією, є за промовчанням глобальними, тому специфікатор extern не обов'язковий.

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

За замовчуванням усі числа є знаковими, відповідно можуть перебувати в діапазоні тільки позитивних чисел. Щоб визначити змінну типу char як знакову пишеться signed char. Long, long long та short вказують, як багато місця у пам'яті відводиться для зберігання. Найбільше – long long, найменше – short.

Char - найменший тип даних у Сі. Для зберігання значень виділяється лише 1 байт пам'яті. Змінної типу character зазвичай надаються символи, рідше — цифри. Символьні значення беруться у лапки.

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

Явне перетворення беззнакової змінної визначається так:

Неявне виглядає так:

Float та double визначають числа з точкою. Числа float представляються як -2.3 чи 3.34. Double використовується для більшої точності – після роздільника цілої та дробової частини вказується більше цифр. Цей тип займає більше місця у пам'яті, ніж float.

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

Логічний тип Bool

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

  • істина;
  • брехня.

Булеві значення можуть перетворюватися на значення типу int. True еквівалентна одиниці, false - нулю. Перетворення типів передбачено лише між bool та int, інакше компілятор видасть помилку.

if (x) ( //Error: «Cannot implicitly convert type 'int' to 'bool"»)

if (x! = 0) // The C# way

Рядки та масиви

Масиви відносяться до складних типів даних у Сі. ЯП не працює з рядками так само, як це робить Джаваскрипт чи Рубі. У Сі всі рядки є масивами елементів символьного значення. Рядки закінчуються нульовим байтом.

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

Існування двох числових типів (цілого та речового) пов'язано з двома можливими формами представлення чисел у пам'яті комп'ютера.

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

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

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

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

У Сі є 4 базові типи:

char- символьний тип;

int- цілий тип,

float- Речовий тип одинарної точності,

double- Речовий тип подвійної точності.

Для завдання похідних типів використовуються кваліфікатори:short(короткий) – використовується з типом int,long(Довгий) - використовується з типами intі double;signed(Зі знаком), unsigned(Без знака) - застосовні до будь-якого цілого типу. За відсутності словаunsignedзначення вважається знаковим,т. е. за замовчуванням прийнятоsigned. У силу допустимості довільного з'єднання кваліфікаторів та назв базових типів один тип може мати кілька позначень. Відомості про стандартні типи Сі представлені в таблицях 1 і 2. Через кому в клітинах першого стовпця перераховані описувачі-синоніми.

Таблиця 1. Стандартні цілі типи даних Сі

Тип даних

Діапазон значень

char, signed char

unsigned int, unsigned

int, signed int, short int, short

2147483648...2147483647

Цікаво, що в Сі тип char залежно від контексту може використовуватися як символьний або цілий тип.

Таблиця 2. Стандартні речові типи даних Сі

Зауваження.Для написання програм першої частини посібника нам знадобляться в основному два типи:floatіint.

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

Мова програмування, зазвичай, має набір примітивних типів даних - типи, надані мовою програмування як базова вбудована одиниця. У 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;