3.2. Числени типове

3.2.1. Целочислени типове


Ще разгледаме целочисления тип int.
Типът е стандартен, вграден в реализацията на езика. За означаването му се използва запазената дума int.

Множество от стойности

Множеството от стойности на типа int зависи от хардуера и реализацията и не се дефинира от ANSI (American National Standarts Institute). Състои се от целите числа от някакъв интервал. За реализацията Visual C++ 6.0, това е интервалът [-2147483648, 2147483647].
Целите числа се записват като в математиката, т.е.
<цяло_число> ::= [+|-]<цяло_без_знак>
<цяло_без_знак> ::= <цифра>|
<цифра><цяло_без_знак>
<цифра> ::= 0| 1| … |9.
Обикновено знакът + се пропуска.
Допълнение: Целите числа могат да са в десетична, осмична и шестнадесетична позиционна система. Осмичните числа започват с 0 (нула), а шестнадесетичните - с 0x (нула, x).

Елементите от множеството от стойности на типа int се наричат константи от тип int.

Променлива величина, множеството от допустимите стойности, на която съвпада с множеството от стойности на типа int, се нарича цяла променлива или променлива от тип int.
Дефинира се по обичайния начин. Дефиницията свързва променливите от тип int с множеството от стойности на типа int или с конкретна стойност от това множество като отделя по 4 байта (1 дума) оперативна памет за всяка от тях. Ако променливата не е била инициализирана, съдържанието на свързната с нея памет е неопределено, а в противен случай – съдържа указаната при инициализацията стойност.
Примери:
int i;
int j = 56;
След тези дефиниции, имаме:
ОП
i j
- 56
4 байта 4 байта

Операции и вградени фунции

Аритметични операции

Унарни операции
Записват се пред или след единствения си аргумент.

+, - са префиксни операции. Потвърждават или променят
знака на аргумента си.
Примери: Нека
int i = 12, j = -7;
Следните означения съдържат унарна операция + или -:
-i +j -j +i -567

Бинарни операции
Имат два аргумента. Следните аритметични операции са инфиксни:

+ - събиране
- - изваждане
* - умножение
/ - целочислено деление
% - остатък от целочислено деление.

Примери:
15 – 1235 = -1220 13 / 5 = 2
15 + 1235 = 1250 13 % 5 = 3
-15 * 123 = -1845 23 % 3 = 2
Забележка: Допустимо е използването на два знака за аритметични операции, но единият трябва да е унарен. Например, допустими са 5-+4, 5+-4, имащи стойност 1, а също 5*-4, равно на –20.

Логически операции

Логическите операции конюнкция, дизюнкция и отрицание могат да се прилагат над целочислени константи. Дефинират се по същия начин, като целите числа, които са различни от 0 се интерпретират true, а 0 – като false.
Примери:
123 and 0 е false
0 or 15 е true
not 67 е false

Операции за сравнение

Над целочислени константи могат да се извършват следните инфиксни операции за сравнение:
== - за равно != - за различно
> - за по-голямо >= - за по-голямо или равно
< - за по-малко <= - за по-малко или равно.
Наредбата на целите числа е като в математиката.
Примери:
123 < 234 е true
-123456 > 324 е false
23451 >= 0 е true

Вградени функции

В езика C++ има набор от вградени функции. Обръщението към такива функции има следния синтаксис:
<име_на_функция>(<израз>, <израз>, …, <израз>)
и връща стойност от типа на функцията.

Тук ще разгледаме само едноаргументната целочислена функция abs.

аbs(x) – намира |x|, където x е цял израз
(в частност цяла константа).

Примери:
abs(-1587) = 1587 abs(0) = 0 abs(23) = 23

За използването на тази функция е необходимо в частта на заглавните файлове да се включи директивата:
#include <math.h>
Библиотеката math.h съдържа богат набор от функции. В някой реализации тя има име math или cmath.

Въвеждане

Реализира се по стандартния и разгледан вече начин.
Пример: Ако
int i, j;
операторът
cin >> i >> j;
въвежда стойности на целите променливи i и j. Очаква се въвеждане от стандартния входен поток на две цели константи от тип int, разделени с интервал, знаците за хоризонтална или вертикална табулация или знака за преминаване на нов ред.

Извеждане

Реализира се чрез оператора
cout << <цяла_константа>;
или по-общо
cout << <цял_израз>;
В текущата позиция на курсора се извежда константата или стойността на целия израз. Използва се минималното количество позиции, необходими за записване на цялото число.
Пример: Нека имаме дефиницията
int i = 1234, j = 9876;
Операторът
cout << i << j << “\n”;
извежда върху екрана стойностите на i и j, но слепени
12349876
Този изход не е ясен. Налага се да се извърши форматиране на изхода. То се осъществява чрез подходящи манипулатори.

Манипулатор setw
Setw е вградена функция.
Синтаксис
setw(<цял_израз>)
Семантика
Стойността на <цял_израз> задава широчината на полето на следващия изход.
Пример: Операторът
cout << setw(10);
не извежда нищо. Той “манипулира” следващото извеждане като указва, че в поле с широчина 10 отдясно приравнена, ще бъде записана следващата извеждана цяла константа.
Забележка: Този манипулатор важи само за първото след него извеждане.
Пример: Нека
ОП
i j
1234 9876
Операторът
cout << setw(10) << i << j << “\n”;
извежда отново стойностите на i и j слепени, като 1234 се предшества от 6 интервала, т.е.
******12349876
където интервалът е означен със знака *.
Операторът
cout << setw(10) << i << setw(10) << j << “\n”;
извежда
******1234******9876

Манипулатори dec, oct и hex

Целите числа се извеждаt в десетична позиционна система. Ако се налага изходът им да е в осмична или шестнадесетична позиционна система, се използват манипулаторите oct и hex съответно. Всеки от тях е в сила, докато друг манипулатор за позиционна система не е указан за следващ извод. Връщането към десетична позиционна система се осъществява чрез манипулатора dec.

dec – манипулатор, задаващ всички следващи изходи (докато не е указан друг манипулатор, променящ позиционната система) на цели числа да са в десетична позиционна система;

oct – манипулатор, задаващ всички следващи изходи (докато не е указан друг манипулатор, променящ позиционната система) на цели числа да са в осмиична позиционна система;

hex - манипулатор, задаващ всички следващи изходи (докато не е указан друг манипулатор, променящ позиционната система) на цели числа да са в шестнадесетична позиционна система.

Пример: Нека имаме
ОП
i j
23
След изпълнението на операторите
cout << setw(10) << dec << i << setw(10) << j << “\n”;
cout << setw(10) << oct << i << setw(10) << j << “\n”;
cout << setw(10) << hex << i << setw(10) << j << “\n”;
имаме:
********12********23
********14********27
*********c********17
Забележка: Преди използване на манипулаторите е необходимо да се включи заглавният файл iomanip.h, т.е. в частта за заглавни файлове да се запише директивата
#include <iomanip.h>

Други целочислени типове

Други цели типове се получават от int като се използват модификаторите short, long, signed и unsigned. Тези модификатори доопределят някои аспекти на типа int.
За реализацията Visual C++ 6.0 са в сила:

Тип Диапазон Необходима памет
short int -32768 до 32767 2 байта
unsigned short int 0 до 65535 2 байта
long int -2147483648 до 2147483647 4 байта
unsigned long int 0 до 4294967295 4 байта
unsigned int 0 до 4294967295 4 байта

Запазената дума int при тези типове се подразбира и може да бъде пропусната. Типовете short int (или само short) и long int (или само long) са съкратен запис на signed short int и signed long int.