ОСНОВНИ ТИПОВЕ ДАННИ И ТЯХНОТО ВЪТРЕШНО ПРЕДСТАВЯНЕ
Променливи и константи
Данните, обработвани от компютъра, са константи и променливи. Всички променливи в C++ трябва да бъдат декларирани изрично. Описанието на променливата включва спецификация на типа, име на променлива, редица незадължителни модификатори, които определят или характеристиките на вътрешното представяне на променливата, или класа на нейното съхранение. При описанието е възможно да се зададе началната стойност на променливата (инициализация на променливата). Типът на константата се разпознава от компилатора по нейното обозначение в програмата.
Скаларните типове включват аритметични типове, изброявания, указатели и референтни типове. Агрегираните типове включват масиви, структури и обединения и класове.
Освен това типовете могат да бъдат разделени на основни (фундаментални) и производни (изведени). Основните типове са void, char, int, float и double, като за някои от тях са приложими варианти short, long, signed и unsigned.
C++ има набор от основни типове, които съответстват на най-често срещаните основни единици компютърна памет и най-често срещаните основни приложения за тях:
char, short int, int, long int за представяне на цели числа с различни размери;
float, double за представяне на числа с плаваща запетая;
unsigned char, unsigned short int, unsigned int, unsigned long int за представяне на цели числа без знак, булеви стойности, растерни изображения и т.н.
Производните типове са указатели и препратки към други типове, масиви, функции, класове, структури и обединения.
Вътрешни данни
Целочисленият тип включва типове данни char, short, int и long, заедно с техните варианти със знак и без знак. Данните от тип int (променливи и константи) могат да бъдат в една от следните възможни форми, посочени в таблица 1.
int данни заКомпилатор Borland C++ 3.1
Както следва от таблицата, short int и int са синоними. Синоними са unsigned int и unsigned.
Езикът C++ поддържа IEEE - стандартът за вътрешно представяне на данни от типа int (фиг. 1).
S - знакова цифра на числото
Фиг. 1. IEEE - стандарт за вътрешно представяне на данни от тип int
В компютър с 16-битов процесор int данните отнемат 2 байта памет (машинна дума), дългите данни отнемат 4 байта. Старшият бит на типовете със знак int, short int, long int съхранява знака на числото. Ако е равно на нула, числото е положително, ако е равно на единица, числото е отрицателно. Положителните числа се съхраняват в паметта и влизат в операции в директен код, т.е. в обичайното двоично представяне на число. Отрицателните числа се съхраняват в паметта на компютъра в допълнение от две. Ето правилото за получаване на допълнителен код:
модулът на отрицателно число се записва в директен код в битове 14-0 или 30-0, "натиснати" вдясно. Неизползваните горни битове са зададени на нули;
знаковият бит на бит 15 или 31 е зададен на 1;
формира се кодът за връщане на битове 14-0 или 30-0; за това нулата се заменя с единица, а единица с нула;
единица се добавя към обратния код на номера.
Например, обратният код на числото -33 във формат int:
Константите от тип int могат да бъдат зададени в десетичен, осмичен и шестнадесетичен запис. Знак на константа в шестнадесетичната бройна система е 0x (0X) като нейните първи знаци. Записът за такава константа може да съдържа цифрите от 0 до 9, както и шестнадесетичните цифри A-F. Всяка константа, която започва от нула, се третира от компилатора като осмична.
Ако константният запис съдържасуфикс L (l), компилаторът интерпретира константата като long. Суфиксът U(u) изрично се отнася до константа от тип unsigned. Разрешено е комбинирането на двата суфикса в произволен ред, например 976LU.
При липса на суфикси L(l) или U(u), точният тип на константата се определя от нейното обозначение (Таблица 2). Отрицателните константи се получават чрез прилагане на унарната операция минус към съответната положителна константа.
Променлива от тип int се декларира с помощта на ключовите думи unsigned, int, short, long. Синоними ще бъдат комбинации от ключови думи: signed int и int; unsigned int и unsigned; short, sort int и signed short int; unsigned short и unsigned short int; long, long int и signed long int; unsigned long и unsigned long int.
Когато една променлива е декларирана, тя може да получи първоначална стойност. Например:
int i=0xabcd, j=04567, k=1;
Целочислени константи и техния тип при липса на суфикси за компилатора
Ако типът е пропуснат от декларацията, се приема, че е int. Например:
всички дефинират обект от тип int.
Тип данни char
Данните от тип char заемат 1 байт в паметта. Кодът от 0 до 255 в този байт указва един от 256-те възможни знака. Присвояването на специфични знаци на кодове се дава от така наречените кодови таблици. За персоналните компютри ASCII таблицата е най-често срещаната.
Типът char е цяло число. Данни от тип char могат да се третират от компилатора както като подписани (signed char), така и като неподписани (unsigned char) данни.
Ако типът char се счита за знак, тогава най-значимият бит от неговия код определя знака. В случай на unsigned char, всичките осем бита се третират като код, а диапазонът от възможни стойности е от 0 до 255.
Константа от тип char е знак, ограден в единични кавички,напр. 'A', '$'. Вътрешният код на байта, съответстващ на константата, се определя от кодовата таблица.
Представянето на група от символни константи е описано по-долу в параграф 2.5.3.
Променлива тип char заема 1 байт памет и се декларира с помощта на ключовата дума char. Когато описвате променлива, можете да й дадете начална стойност. Например:
char symbol='\0100'; /* латински главни букви P */
charname='0', first='\n';
Данни с плаваща запетая
Езикът Borland C++ поддържа операции с плаваща запетая. Характеристика на персоналните компютри IBM PC е липсата в системата от команди на микропроцесора Intel, на базата на който са изградени, операции с числа с плаваща запетая. Такива аритметични операции се извършват или от специален математически копроцесор с плаваща запетая (копроцесори 8087/80287/80387), или, при липсата му, от специални стандартни процедури (софтуерна емулация на копроцесора).
Компилаторът използва три форми на вътрешно представяне на данни с плаваща запетая (Таблица 3).
Данни с плаваща запетая за компилатор Borland C++ 3.1
Borland C++ поддържа стандарта IEEE, според който такива данни се представят като две части - мантиса M и експонента P на число в двоичната бройна система:
Броят на битовете за съхраняване на мантисата и степента зависи от типа данни с плаваща запетая (Фигура 2).
S - знак на числото (0 - за положителен, 1 - за отрицателен);
P е изместеният ред на числото;
M е мантисата на числото.
Ориз. 2. IEEE-стандарт за вътрешно представяне на данни с плаваща запетая.
Реално число се съхранява в паметта с нормализирана мантиса. Ако нормализацията е нарушена, мантисата се измества наляво до най-високата цифра на мантисатане става 1. Всяка операция на смяна е придружена от намаляване на реда с 1. Но ако мантисата винаги е нормализирана, тогава най-високата единица може да не се съхранява в паметта. Това спестява един бит и следователно увеличава прецизността на представянето на реални числа. Тази единица присъства имплицитно и се нарича имплицитна. Премахването на старшата цифра на мантисата се извършва за формати float и double, но не се извършва за long double.
Редът на числото се съхранява "изместен", тоест към него се добавя число, така че редът винаги да е неотрицателен. За float числа се добавя 127, за двойни числа - 1023, за дълги двойни числа - 16383. Винаги неотрицателният ред елиминира необходимостта от заделяне на един бит за съхраняване на знака на експонентата и опростява сравнението на редове и аритметични операции върху тях.
Например числото 15.375 (1111.011 в двоичен) във формат IEEE float се записва така:
Като вземем предвид отхвърлянето на неявната единица и изместването на реда, получаваме вътрешното представяне на числото:
P \u003d 3 + 127 \u003d 130 (1000.0010 в двоична система);
Променливите с плаваща запетая се декларират с помощта на спецификатори на типа float, double, long double.
Причината, поради която са представени повече от един целочислен тип, повече от един неподписан тип и повече от един тип с плаваща запетая, е да позволи на програмиста да се възползва от присъщите характеристики на хардуера. На много машини има значителни разлики в изискванията за памет, времето за достъп до паметта и времената за изчисление между различните разновидности на основните типове. Размерите на типа не са посочени в езиковия стандарт, но зависят от операционната система, компилатора ибитов процесор. На компютри с 16-битови процесори int е 2 байта, на компютри с 32-битови процесори 4 байта и т.н. Езиковият стандарт C++ определя следните връзки по отношение на размерите на основните типове: