Арифметичні типи даних: операції, вирази, зведення типів у виразах


Базові поняття програмування

Базові поняття програмування

 

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

 

 

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

bool, сhar, int і double (зазвичай вживають подвоєну, а не звичайну точність). Інші арифметичні типи служать предметом особливих застосувань (оптимізація, системне програмування, тощо).

 

Назва типу Позначення Діапазон значень
Логічний (булів) bool false, true (true+true==true)
Символьний сhar, unsigned сhar від 0 до 255 ( 255+1=0 )
  signed сhar від -128 до 127 ( 127+1=-128 )
     
Цілий short (short int) Визначається з умов 1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long); 1 <=sizeof(bool) <=sizeof(long); sizeof(N) == sizeof(signed N) == sizeof(unsigned N);
  unsigned short (unsigned short int)  
  int (signed int)  
  unsigned (unsigned int)  
  long (long int)  
  unsigned long (unsigned long int)  
Довгий символ wchar_t unsigned short
Дійсний, звичайна точність float     sizeof(float) ? sizeof(double) ? sizeof(long double)
подвоєна точність double  
розширена точність long double  

 

Бульовим може бути будь-яке арифметичне значення. Все, що відмінне від нуля, вважається істинним.

 

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

sizeof — це стандартна функція, значенням якої є розмір пам'яті, відведеної для типу або об'єкта):

 

#include <iostream>

 

using namespace std;

 

code1 #include <iostream>

using namespace std;

int main()

{

bool b;

char c;

unsigned char cu;

signed char csg;

short s;

short int is;

signed short int issg;

unsigned short int ius;

unsigned short su;

int i;

signed int isg;

unsigned int iu;

signed sg;

unsigned u;

long int il;

signed long int ilsg;

long l;

signed long lsg;

unsigned long int ilu;

unsigned long lu;

float f;

double d;

long double ld;

cout

<< "\n bool= " << sizeof(b)

<< "\n char= " << sizeof(c)

<< "\n unsigned char = " << sizeof(cu)

<< "\n signed char = " << sizeof(csg)

<< "\n short = " << sizeof(s)

<< "\n short int= " << sizeof(is)

<< "\n signed short int = " << sizeof(issg)

<< "\n unsigned short int = " <<sizeof(ius)

<< "\n unsigned short = " <<sizeof(su)

<< "\n int = " << sizeof(i)

<<"\n signed int = " << sizeof(isg)

<< "\n unsigned int = " << sizeof(iu)

<< "\n signed = " << sizeof(sg)

<< "\n unsigned= " << sizeof(u)

<< "\n long int= " << sizeof(il)

<< "\n signed long int= " << sizeof(ilsg)

<< "\n long = " << sizeof(l)

<< "\n signed long = " << sizeof(lsg)

<< "\n unsigned long int= " << sizeof(ilu)

<< "\n unsigned long = "<<sizeof(lu)

<< "\n float = " << sizeof(f)

<< "\n double = " <<sizeof(d)

<< "\n long double = " << sizeof(ld)

<< endl;

return 0;

}

 

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

 

Передбачена можливість створення власних перелічуваних типів ( enumeration ), наприклад, перелік

 

enum week

 

{monday=1, tuesday, wednesday, thursday, friday,

 

saturday, sunday}

 

задає новий тип, складений з наведених констант. Їх коди можуть задаватися явно, наприклад,

 

enum week {two=2, eight=8, ten=10, hex=16 }

 

Інакше коди приписуються по порядку, починаючи з першої константи. ЇЇ код, якщо його не задано спеціально, вважається нулем.

 

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

 

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

 

Арифметичні операції
Символ операції Назва Спосіб використання
* Множення op1 * op2
/ Ділення op1 / op2
% Остача op1 % op2
+ Додавання op1 + op2
- Віднімання op1 - op2
, Кома op1, op2

 

Операція “кома” використовується тоді, коли на місці, синтаксично придатному для розміщення одного виразу, необхідно розмістити декілька виразів. Значенням виразу, побудованого за допомогою цієї операції, вважається значення її другого операнда. Перший операнд виявляється як би зайвим, на перший погляд його обчислення стає безрезультатним. Але це не так, оскільки в С++ існують операції, здатні змінювати значення змінних, зокрема, операцією є саме присвоєння, а також операції інкременту і декременту (див.

3.3).

 

Крім арифметичних операцій до операндів арифметичних типів можуть застосовуватися операції порівняння. Їх результат завжди булів.

 

Операції порівняння
Символ операції Назва Спосіб використання
< Менше op1 < op2
<= Менше або рівне op1 <= op2
> Більше op1 > op2
>= Більше або рівне op1 >= op2
== Рівне op1 == op2
!= Не рівне op1 != op2

 

Особливу увагу варто звернути на специфічне позначення рівності. Вживання знаку присвоєння ”=” замість знаку рівності ”==” — одна з самих типових помилок в С/С++-програмах.

 

С++ успадкував від С два типи логічних операцій. Крім звичайних заперечення, кон'юнкції і диз'юнкції, є ще побітові логічні операції, які застосовуються до будь-яких інтегральних типів.

 

Логічні операції
Символ операції Назва Спосіб використання
! Заперечення ! op
&& Кон'юнкція op1 && op2
|| Диз'юнкція op1 || op2
? : Імплікація (op1 ? op2: op3)

 

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

 

(true ? x: y) == x

 

(false ? x: y) == y

 

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

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

 

Логічні побітові операції
Символ операції Назва Спосіб використання
~ Заперечення ~ op
<< Зсування вліво op1 << op2
>> Зсування вправо op1 >> op2
& Кон'юнкція op1 & op2
^ Виключна диз'юнкція op1 ^ op2
| Диз'юнкція op1 | op2

 

Побітові логічні операції — це програмування на низькому, близькому до машинного, рівні. Програмування рівнем вище використовує стандартний клас bitset

, визначений у стандартній бібліотеці. Його ми розглянемо у розділі 6.6.

 

Розглянемо простий приклад. Візьмемо ціле число a=4227661320 , воно менше, ніж