§ 2. Арганізацыя вылічэнняў

2.3. Цэлалікавы тып даных

Часта пры рашэнні задач трэба працаваць з цэлымі лікамі. Для гэтага ў C++ выкарыстоўваецца тып даных int.

З дапамогай пераменных тыпу можна задаваць цэлыя лікі з дыяпазону ад –2147483648 да 2147483647. Для гэтага тыпу даных вызначаны наступныя аперацыі:

Матэматычныя аперацыі

Запісу у С++

+ (складанне) +
– (адніманне)
∙ (множанне) *
цэлалікавае дзяленне /
знаходжанне астачы %

У С++ для дзялення як цэлых, так і рэчаісных лікаў выкарыстоўваецца адзін і той жа знак «/». Будзе вынік цэлым ці рэчыўным, залежыць ад аперандаў (пераменных ці лікаў, якія стаяць злева і справа ад знака). Калі хоць бы адзін аперанд рэчыўны, то вынік будзе рэчыўным. Калі абодва аперанды цэлыя, то і вынік будзе цэлым.

Аперацыя «%» адпавядае аперацыі mod у мове праграміравання Pascal і выкарыстоўваецца толькі для цэлых лікаў.

Прыклад 2.6. Дадзены два цэлыя лікі a і b. Напісаць праграму, якая знаходзіць цэлую частку і астачу ад дзялення a на b.

Этапы выканання задання

I. Зыходныя даныя: пераменныя a і b.

II. Вынік: пераменныя c (цэлалікавая дзель) і d (астача).

III. Алгарытм рашэння задачы.

1. Увод зыходных даных. 
2. Цэлалікавую дзель знаходзім як вынік аперацыі: a/b, астача — a%b.
3. Вывад выніку.

IV. Апісанне пераменных: a, b, c, d  int.

Значэнне, якое выдае ў якасці выніку аперацыя %, можа адрознівацца ад матэматычнага азначэння астачы (у матэматыцы пад астачай разумеюць неадмоўны лік). Калі астача не роўна нулю, то знак ліку, які з’яўляецца вынікам аперацыі %, вызначаецца знакамі аперандаў (прыклад 2.7). Калі прааналізаваць даныя з табліцы, то можна зразумець, што  begin mathsize 16px style a space percent sign space b space equals space a space minus space open square brackets a over b close square brackets space cross times space b end style [1].

Пры выкананні арыфметычных аперацый трэба памятаць, што спачатку аперацыя выконваецца ў адпаведнасці з тыпамі аперандаў, а затым адбываецца пераўтварэнне атрыманага тыпу да тыпу выніку. Напрыклад, няхай у праграме запісана каманда:

double = 16 / 7;

Спачатку будзе выканана дзяленне 16 на 7 (цэлалікавае), у выніку атрымаем 2. Пасля чаго цэлае значэнне 2 будзе пераўтворана да рэчыўнага значэння 2.0. Каб атрымаць рэчыўны вынік, неабходна, каб хаця б адзін лік быў рэчыўным. Каманду можна запісаць, напрыклад, так:

double x = 16. / 7;

Калі ў аператары прысвойвання выкарыстоўваюцца не канстанты, а пераменныя, то неабходна пераўтварыць выраз так, каб дзеянні выконваліся з патрэбным тыпам. Напрыклад, аператар прысвойвання 

double x = a / b;

у якім a і b цэлалікавыя пераменныя, можна запісаць так:

double x = 1. */ b;

Тады вынік аперацыі множання будзе рэчыўным і дзяленне будзе выконвацца для рэчаісных лікаў.


[1] Дужкі open square brackets blank close square brackets  абазначаюць акругленне ліку да цэлага ў меншы бок.

 

Тып int з’яўляецца базавым цэлалікавым тыпам. Іншыя цэлалікавыя тыпы можна атрымліваць, прыпісваючы да int мадыфікатары. Адрозніваюць два тыпы мадыфікатараў, якія могуць змяняць знакавасць ці памер.

Знакавасць:

signed — тып будзе мець знакавае ўяўленне (выкарыстоўваецца па змоўчанні, калі мадыфікатар не вызначаны);

unsigned — тып будзе мець бяззнакавае ўяўленне.

Памер:

short — тып будзе займаць у памяці не менш за 16 біт;

long — тып будзе мець памер, не меншы за 32 біт;

long long — тып будзе мець памер, не меншы за 64 біты.

Прыклады выкарыстання мадыфікатараў:

Тып

Дыяпазон значэнняў

Памер (біт)

short int 32768..32767 16
unsigned short int 0..65535 16
int 2147483648.. 2147483647 32
unsigned int 0..4294967295 32
long long int  263 .. 263  1 64
unsigned long long int 0 .. 264  1 64

Калі пры апісанні выкарыстоўваюць мадыфікатары, то слова int можа быць прапушчана. Наступныя апісанні эквівалентныя:

short int short
unsigned int unsigned
long long int long long
unsigned long long int unsigned long long

Прыклад 2.6.  

V. Праграма:

#include <iostream>

using namespace std;

int main()

{

  int a, b;

  cout << "Vvedi 2 chisla" << endl;

  cin >> a >> b;

  int c = a / b;

  int d = a % b;

  cout << "a / b = " << c << endl;

  cout << "a % b = " << d << endl;

  return 0;

}

IV. Тэсціраванне праграмы:

Запусціце праграму і ўвядзіце значэння a = 11 и b = 4.

Вынік павінен быць наступным:

Прыклад 2.7.  Вынік аперацый div і mod для розных лікаў:

a

b

a / b

a % b

17 3 5 2
–17 3 –5 –2
17 –3 –5 2
–17 –3 5 –2

У мове С++ дапускаецца відавочнае пераўтварэнне тыпаў. Для гэтага выкарыстоўваецца каманда 

     static_cast<dataType>(value   

Тут dataType — імя тыпу, да якога трэба пераўтварыць велічыню value.

У кодзе праграмы гэта каманда выкарыстоўваецца наступным чынам:

  double static_cast<double>(a)/b;  

Таксама кампілятарам С++ падтрымліваецца так званы Cі-стыль прывядзення тыпаў даных, калі новы тып паказваецца ў дужках перад імем пераменнай:

    double x = (double)/ b;    

Кампілятар C++ таксама дазваляе выкарыстоўваць гэты аператар і наступным чынам:

    double = double(a) / b;  

Аднак такое пераўтварэнне лічыцца небяспечным, паколькі кампілятар не правярае выхад за мяжу магчымых значэнняў тыпу.