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




Основні (базові) типи даних C++



Пошук на інших ресурсах:

1. Які є основні типи даних у мові C++?

Відповідь:

  1. Цілочисельні типи даних:
short int, unsigned short int, int, unsigned int, long, unsigned long, long long, unsigned long long
  1. Типи даних з плаваючою комою (дійсні типи):
float, double, long double
  1. Символьний тип даних:
char (signed char), unsigned char, wchar_t
  1. Логічний тип даних:
bool
  1. Перечислювальний тип даних (введений у Visual C++):
enum


2. Які особливості використання цілочисельних типів даних?

В C++ реалізовано такі основні цілочисельні типи даних:

short int
unsigned short int
int
unsigned int
long (long int)
unsigned long (unsigned long int)
long long
unsigned long long

Ці типи даних представляють значення з множини цілих чисел. Наприклад:

2
-100
398
209320320932

Типи даних, що починаються з приставки unsigned, можуть містити тільки додатні (беззнакові) числа.

Дані типу short int, unsigned short int займають у два рази менше місця в пам’яті ніж дані типу int, unsigned int. У нових версіях компілятора дані типу short int займають 2 байти.

У старіших версіях компіляторів дані типу long, unsigned long займають у два рази більше місця в пам’яті ніж дані типу int, unsigned int. В останніх версіях компіляторів дані типу int (unsigned int) займають таке саме місце в оперативній пам’яті як і дані типу long (unsigned long).

Дані типу long long (unsigned long long) займають у 2 рази більше місця в пам’яті ніж дані типу long (unsigned long).

Приклад. У прикладі визначається розмір даних цілочисельного типу з допомогою інструкції sizeof. Більш детально про оператор sizeof можна прочитати тут.

#include <iostream>
using namespace std;

void main()
{
  // Розмір в байтах різних цілочисельних типів 
  cout << "sizeof(short int) = " << sizeof(short int) << endl;
  cout << "sizeof(unsigned short int) = " << sizeof(unsigned short int) << endl;
  cout << "sizeof(int) = " << sizeof(int) << endl;
  cout << "sizeof(unsigned int) = " << sizeof(unsigned int) << endl;
  cout << "sizeof(long) = " << sizeof(long) << endl;
  cout << "sizeof(unsigned long) = " << sizeof(unsigned long) << endl;
  cout << "sizeof(long long) = " << sizeof(long long) << endl;
  cout << "sizeof(unsigned long long) = " << sizeof(unsigned long long) << endl;
}

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

sizeof(short int) = 2
sizeof(unsigned short int) = 2
sizeof(int) = 4
sizeof(unsigned int) = 4
sizeof(long) = 4
sizeof(unsigned long) = 4
sizeof(long long) = 8
sizeof(unsigned long long) = 8

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

  • змінні типів short int та unsigned short int займають 2 байти;
  • змінні типів int, unsigned int, long (long int), unsigned long (unsigned long int) займають 4 байти;
  • змінні типів long long (unsigned long long) займають 8 байт.


3. Як у програмі описати змінну з іменем x цілого типу?

Відповідь:

int x; // ціле зі знаком

У результаті під змінну x буде виділене місце в пам’яті розміром 4 байти. Розмір пам’яті, що виділяється під змінну залежить від характеристик комп’ютера, типу операційної системи та налаштувань компілятора.


4. Як у змінну цілого типу записати число 239?

Для цього використовується оператор присвоєння, який позначається символом ‘=‘.

Відповідь 1. Внесення числа у змінну після її опису.

int x;
x = 239;

Відповідь 2. Внесення числа у змінну під час її опису (початкова ініціалізація).

int x = 239;


5. Які особливості типів даних з плаваючою комою?

Типи даних з плаваючою комою дозволяють представляти значення з множини дійсних чисел. Наприклад:

8.35
-990.399
239.0

У C++ є такі основні типи даних з плаваючою комою: float, double, long double.

Змінна типу double займає в 2 рази більше місця в пам’яті комп’ютера ніж змінна типу float.

Так само змінна типу long double займає в 2 рази більше місця в пам’яті комп’ютера, ніж змінна типу double.







6. Як описати змінну, яка приймає значення з плаваючою комою?

Приклад опису змінних типу float, double, long double:

float f;
double d;
long double ld;


7. Як в змінну з плаваючою комою записати числові значення?

Приклад внесення числових даних в змінні типів з плаваючою комою:

float f = -9928.45; // початкова ініціалізація
double d;
long double ld;
d = 0.445332; // оператор присвоєння
ld = 3892923898239.030903; // оператор присвоєння


8. Як перевести змінну типу float в тип int?

Для цього використовується операція приведення типів. У дужках потрібно вказати назву типу до якого відбувається приведення.

Приклад:

float a;
int b;
a = 8.457;
b = (int) a; // b = 8

При використанні операцій приведення типів, потрібно враховувати обмеження, що накладаються на типи, які займають менше місця в пам’яті комп’ютера.

Наприклад, змінна типу short int може представляти менший діапазон чисел, ніж змінні типу float, double. У наступному лістингу відбувається переповнення значення у змінній типу short int:

short int i;
float f;
f = 3990099.8;
i = (int)f; // i = -7597 - переповнення


9. Як перевести змінну з типу int в тип double?

Приклад приведення з int в double:

int i;
double d;
i = 982;
d = (double)i; // d = 982.0


10. Які особливості використання даних типу char (символьних даних) у програмі?

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

Наприклад, код символу ‘f’ рівний значенню 102.

Фрагмент коду, в якому обчислюється код символу:

int code;
char symbol;
symbol = 'f';
code = (int)symbol; // code = 102

Тобто, дані типу char є тими самими цілими числами. Дані типу char займають в пам’яті комп’ютера 1 байт.

Співвідношення “символ-код” розміщується у таблиці символів Windows. Символи з кодами від 0 до 127 – це зарезервовані символи BIOS. Вони включають найбільш вживані символи, символи цифр, символи латинської абетки. Ці символи змінити неможна.

Символи з кодами від 128 до 255 – це регіональні символи, що прив’язані до конкретної абетки того комп’ютера на якому встановлена операційна система Windows.


11. Які особливості використання даних типу bool (логічний тип)?

Змінні типу bool можуть приймати тільки два значення:

  • true – істина,
  • false – фальш (неістина).

Ці змінні використовуються для перевірки логічних виразів. Числове значення true рівне 1. Числове значення false рівне 0.

Фрагмент коду, що визначає числові значення true та false:

int result;
bool b;
result = (int)true; // result = 1
b = false;
result = (int)b;    // result = 0

Фрагмент коду, що перетворює типи int та float в bool:

int i;
float f;
bool b;
i = 6;
b = (bool)i; // b = True
f = 0.0;
b = (bool)f; // b = False


12. Як визначити розмір того чи іншого типу в C++?

Для цього використовується операція sizeof().

Фрагмент коду, що визначає розмір деяких типів даних:

int d;
d = sizeof(char);         // d = 1
d = sizeof(unsigned int); // d = 4
d = sizeof(float);        // d = 4
d = sizeof(double);       // d = 8


13. Яким чином здійснюється ініціалізація змінних різних типів?

int d = 28;
float z = (float)2.85;
char c = 'k';
String ^s = "Hello!";
double r = -8.559;


14. Яким чином визначити максимально допустиме (мінімально допустиме) значення змінної певного типу?

Щоб визначити максимально допустиме чи мінімально допустиме значення змінної деякого типу в бібліотеці .NET Framework використовуються властивості MaxValue та MinValue.

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

Для змінних типу int:

// тип int
int i;
long MaxInt;
long MinInt;
MaxInt = (long)i.MaxValue; // MaxInt = 2147483647
MinInt = (long)i.MinValue; // MinInt = -2147483648

Для змінних типу short int:

// тип short int
short int si;
int MaxInt;
int MinInt;
MaxInt = (int)si.MaxValue; // MaxInt =  32767
MinInt = (int)si.MinValue; // MinInt = -32768

Для змінних типу unsigned int:

// тип unsigned int
unsigned int ui;
unsigned int MaxInt;
unsigned int MinInt;
MaxInt = ui.MaxValue; // MaxInt = 4294967295
MinInt = ui.MinValue; // MinInt = 0

Для змінних типу float:

// тип float
float f;
float MaxF;
float MinF;
MaxF = f.MaxValue; // MaxF =  3.402823E+38
MinF = f.MinValue; // MinF = -3.402823E+38

Для змінних типу double:

// тип double
double d;
double MaxD;
double MinD;
MaxD = d.MaxValue; // MaxD = 1.79769313486232E+308
MinD = d.MinValue; // MinD = -1.79769313486232E+308

Для змінних типу char:

// тип char
char c;
int MaxC;
int MinC;
MaxC = (int)c.MaxValue; // MaxC =  127
MinC = (int)c.MinValue; // MinC = -128


15. Які особливості використання типу enum?

Тип enum – це перечислювальний тип даних. В ньому задаються мнемонічні значення для множин цілих значень. Кожне мнемонічне значення має певний зміст і позначається цілим числом.

Приклад використання типу enum для позначення місяців року:

enum months { January, February, March, April, May, June, July, 
              August, September, October, November, December } mn;
mn = January;   // mn = 0
mn = March;     // mn = 2
mn = September; // mn = 8

У наведеному прикладі описується змінна з іменем mn типу enum months. Мнемонічні значення місяців (January, February, …) починаються з 0 (0, 1, 2, …). Мнемонічному значенню January відповідає ціле значення 0, мнемонічному значенню February відповідає ціле значення 1, і т.д.

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

Можна написати й так:

mn = (enum months)2;  // mn = March
mn = (enum months)11; // mn = December


16. Які особливості застосування типу void в програмах на C++? Покажчик на void

Тип даних void використовується у наступних випадках:

  • коли потрібно описати функцію, яка не повертає ніякого значення (див. приклад);
  • коли потрібно описати функцію, яка не отримує параметрів (див. приклад);
  • якщо потрібно оголосити покажчик на void, який може взаємодіяти з покажчиками на інші типи (дивіться приклад нижче). У даному випадку, покажчик на void може бути приведений до типу покажчика на будь-який інший тип (int*, float*, double* і т.д.)

Приклад 1. Функція MyFun() без параметрів, яка не повертає ніякого значення (повертає тип void) і не отримує параметрів.

public: void MyFun(void)
{
   // тіло функції
   // ...

   return; // повернення з функції, яка не повертає значення
}

// виклик функції з програми
...
MyFun();
...

Приклад 2. У прикладі демонструються деякі особливості використання покажчика на void.

#include <iostream>
using namespace std;

void main()
{
  // Оголосити покажчик на void
  void *pVoid;

  // Оголосити покажчики на інші типи
  int *pInt = new int;
  float *pFloat = new float;
  char *pChar = new char;
  double *pDouble = new double;

  // Заповнити значення за покажчиками на інші типи
  *pInt = 25;
  *pFloat = (float)3.88;
  *pChar = '+';
  *pDouble = 17.25;

  // Присвоїти покажчику на void значення покажчиків на інші типи
  // - на покажчик на тип float
  pVoid = pFloat; // покажчик pVoid вказує на область пам'яті pFloat
  *(float*)pVoid = 85.77; // змінити значення *pFloat
  cout << "*pFloat = " << *pFloat << endl; // *pFloat = 85.77

  // - на покажчик типу char*
  pVoid = pChar; 
  *(char*)pVoid = 'a';
  cout << "*pChar = " << *pChar << endl; // *pChar = a

  // -----------------------------------------------------------------
  // Використати покажчик на void для обміну значеннями покажчиків на int
  int *p1 = new int; 
  int *p2 = new int;

  // заповнити значеннями пам'ять, на яку вказують покажчики p1, p2
  *p1 = 28;
  *p2 = 35;

  cout << "*p1 = " << *p1 << endl; // *p1 = 28
  cout << "*p2 = " << *p2 << endl; // *p2 = 35

  // обмін значеннями покажчиків з допомогою покажчика на void
  pVoid = p1;
  p1 = p2;
  p2 = (int*)pVoid;

  cout << "*p1 = " << *p1 << endl; // *p1 = 35
  cout << "*p2 = " << *p2 << endl; // *p2 = 28 
}

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

*pFloat = 85.77
*pChar = a
*p1 = 28
*p2 = 35
*p1 = 35
*p2 = 28


17. Чи можна оголошувати змінну типу void в програмі?

Не можна, Тому що тип void не зв’язаний зі значенням. Оголошення змінної типу void призводить до помилки компіляції з повідомленням:

"Illegal use of type void".

Однак, можна оголосити покажчик на void.


18. Які особливості застосування типу wchar_t у Visual C++?

Змінні типу char (дивіться попередні пункти) використовуються для зберігання 8-розрядних ASCII-символів.

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

Приклад використання типу wchar_t.

...

wchar_t t; // для змінної t виділяється 2 байти пам'яті
t = 's';

...


19. Який об’єм пам’яті резервується для опису однієї змінної типу wchar_t?

Одна змінна типу wchar_t займає в пам’яті комп’ютера 2 байти (16 біт). Діапазон цілочисельних значень змінних типу wchar_t становить від 0 до 65535.

20. Як визначити, яке максимальне (мінімальне) значення може містити змінна цілочисельного або символьного типу? Константи INT32_MIN, INT32_MAX та інші

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

Наприклад, якщо змінна цілого типу займає 2 байти (16 біт), то діапазон допустимих значень може бути таким:

  • для знакових змінних: -32768 … 32767;
  • для беззнакових змінних (з приставкою unsigned): 0 … 65535.

В C++ є засоби для визначення мінімального та максимального значення, яке може приймати змінна цілочисельного або символьного типу. У бібліотеку C++ входить модуль <limits.h>, який містить опис відповідних констант. Ці константи можна використовувати у програмах при перехопленні різноманітних виключних ситуацій, наприклад, переповнення, вихід за межі індексу в масиві тощо.

Наприклад, щоб порівняти значення змінної типу int на максимальне, можна використати константу INT32_MAX за зразком, як показано нижче

...
// Визначення моменту, коли відбувається переповнення 
int i = 0;
while (1)
{
  // збільшити лічильник
  i++;

  // деякі операції
  // ...

  // порівняти на максимально-допустиме значення
  if (i == INT32_MAX)
  {
    cout << "Error. Overflow.";
    return;
  }
}
...

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

#include <iostream>
using namespace std;

void main()
{
  // Символьні типи даних - максимальні та мінімальні значення
  cout << "SCHAR_MIN = " << SCHAR_MIN << endl; // char - мінімальне значення
  cout << "SCHAR_MAX = " << SCHAR_MAX << endl; // char - максимальне значення
  cout << "USCHAR_MAX = " << UCHAR_MAX << endl; // unsigned char - максимум

  // Цілочисельні типи даних - максимальні та мінімальні значення
  cout << "SHRT_MIN = " << SHRT_MIN << endl; // short int - мінімальне значення
  cout << "SHRT_MAX = " << SHRT_MAX << endl; // short int - максимальне значення
  cout << "USHRT_MAX = " << USHRT_MAX << endl; // unsigned short int - максимум
  cout << "INT16_MAX = " << INT16_MAX << endl; // int (16 розрядне) - мінімум
  cout << "INT16_MIN = " << INT16_MIN << endl; // int (16 розрядне) - максимум 
  cout << "UINT16_MAX = " << UINT16_MAX << endl; // unsigned int - максимум 
  cout << "INT32_MIN = " << INT32_MIN << endl; // int (32-розрядне) - мінімум
  cout << "INT32_MAX = " << INT32_MAX << endl; // int (32-розрядне) - максимум
  cout << "UINT32_MAX = " << UINT32_MAX << endl; // unsigned int - максимум
  cout << "LONG_MIN = " << LONG_MIN << endl; // long int - мінімум
  cout << "LONG_MAX = " << LONG_MAX << endl; // long int - максимум
  cout << "ULONG_MAX = " << ULONG_MAX << endl; // unsigned long - максимум
  cout << "LLONG_MAX = " << LLONG_MAX << endl; // long long - максимум
  cout << "LLONG_MIN = " << LLONG_MIN << endl; // long long - мінімум
  cout << "ULLONG_MAX = " << ULLONG_MAX << endl; // unsigned long long - максимум
}

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

SCHAR_MIN = -128
SCHAR_MAX = 127
USCHAR_MAX = 255
SHRT_MIN = -32768
SHRT_MAX = 32767
USHRT_MAX = 65535
INT16_MAX = 32767
INT16_MIN = -32768
UINT16_MAX = 65535
INT32_MIN = -2147483648
INT32_MAX = 2147483647
UINT32_MAX = 4294967295
LONG_MIN = -2147483648
LONG_MAX = 2147483647
ULONG_MAX = 4294967295
LLONG_MAX = 9223372036854775807
LLONG_MIN = -9223372036854775808
ULLONG_MAX = 18446744073709551615


Зв’язані теми