Примитивни тип података
У информатици, примитивни тип података је један од следећих појмова:
- основни тип је тип података [1] обезбеђен од стране програмског језика као основни градивни блок. Већина језика дозвољава сложеније композитне типове да се рекурзивно изграде почевши од основних типова.
- уграђени тип је тип података за који програмски језик обезбеђује уграђену подршку.
У већини програмских језика, све основне врсте података су уграђене. Поред тога, многи језици пружају и низ сложених типова података. Мишљења се разликују око тога да ли треба сматрати уграђени тип који није базичан „примитивом“.
У зависности од језика и његовог спровођења, примитивни типови података могу али не морају да имају један-на-један пресликавање са објектима у меморији рачунара. Међутим, обично се очекује да операције над основним примитивним типовима података буду најбрже језичке конструкције које постоје. Сабирање целих бројева, на пример, може бити изведено као једна машинска инструкција, док неки процесори нуде прецизна упутства за обрађивање секвенци знакова са једним упутством. Конкретно, C стандард помиње да „обичан Инт објекат има природну величину предложену од стране архитектуре извршилачког окружења“. То значи да ће int
вероватно бити дуг 32 бита на 32-битној архитектури. Основни примитивни типови су готово увек вредносни типови.
Већина програмских језика не дозвољава да се понашање или могућности примитивних (уграђених или основних) типова података мењају програмима. У изузетке спада Smalltalk, који дозвољава да се сви типови података проширују у оквиру програма, додајући на операције које се могу обављати на њима или чак редефинисање уграђених операција.
Преглед
[уреди | уреди извор]Стварни опсег примитивних типова података који је доступан зависи од конкретног програмског језика који се користи. На пример, у C, ниске су композитни, али уграђени тип података, док су у модерним дијалектима Бејсику и Јаваскрипту, оне асимиловане у примитивни тип података који је и основни и уграђени.
Класични основни примитивни типови могу укључивати:
- Знакове (
character
,char
); - Целе бројеве (
integer
,int
,short
,long
,byte
) са различитом прецизношћу; - Реалане бројеве (
float
,double
,real
,double precision
); - Бројеве фиксног зареза (
fixed
) са разним прецизностима и програмерско-изабраном скалом. - Булове, логичке вредности тачно и нетачно.
- Референце (такође се назива и показивач или ручица), мала вредност која се односи на адресу другог објеката у меморији, вероватно много већег од ње.
Софистицираније врсте које могу бити уграђене укључују:
- Торка у ML, Пајтону
- Листа у Lispу
- Комплексни број у Фортрану, C (Ц99), Lisp-у, Пајтону, Перл 6, D
- Рационалан број у Lisp-у, Перл 6
- Асоцијативни низ у разним облицима, у Lisp-у, Перлу, Пајтону, Lua, D
- Функција прве класе, затворење, настављање у језицима који подржавају функционално програмирање као што су Lisp, ML, Перл 6, D и C# 3.0
Специфични примитивни типови података
[уреди | уреди извор]Цели бројеви
[уреди | уреди извор]Цео број као тип података може да садржи цео број, али не и разломак. Цели бројеви могу бити или означени (дозвољавајући негативне вредности) или неозначени (само не негативне вредности). Типичне величине целих бројева су:
Величина (Бајт) | Величина (Бит) | Имена | Означен опсег | Неозначен опсег |
---|---|---|---|---|
1 бајт | 8 бита | Бајт | −128 to +127 | 0 до 255 |
2 бајтова | 16 бита | Реч,
кратак цео број |
−32,768 до +32,767 | 0 до 65,535 |
4 бајтова | 32 бита | Дупла Реч, дугачак цео број (вин32, вин64, 32-бит Линукс[2]) | −2,147,483,648 до +2,147,483,647 | 0 до 4.294.967,295 |
8 бајтова | 64 бита | дугачак цео број (Ц у 64-бит линукс[2]), long long (C), long (у Јави само означена варијанта[3]) | −9,223,372,036,854,775,808 до +9,223,372,036,854,775,807 | 0 до 18.446.744,073,709,551,615 |
бесконачан
/ 8 |
бесконачан | Бигнум | -( ( 2 ^ бесконачан
) / 2 ) to +( ( 2 ^ бесконачан ) / 2 ) |
0 до 2 ^ бесконачан |
Литерали за целе бројеве се састоје од низа цифара. Већина програмских језика забрањује употребу запета за груписање цифара, иако Фортран (77, 90, и изнад, фиксни облик извора, али не и слободан облик извора) омогућава уграђене просторе, док Перл, Руби, Јава и D дозвољавају уграђене доње црте. Негација је означена знаком минус (-) пре вредности. Примери целих литерала су:
- 42
- 10000
- −233000
Булови
[уреди | уреди извор]Булов тип, обично означен са „бул“ (bool
, boolean
), обично је логички тип који може имати вредност „тачно“ или „нетачно“. Иако је само један бит неопходан да се смести подешена вредност „тачно“ или „нетачно“, програмски језици обично имплементирају логичке типове као један или више бајтова.
Већина језика (Јава, Паскал и Ада, на пример) извршава булове типове поштујући концепте булова као посебаног логичког типа. Језици, међутим, могу имплицитно конвертовати логичке у нумеричке типове некад да дају проширену семантику буловима и логичким изразима или да постигне компатибилност са ранијим верзијама језика. У C++, на пример, Логичке вредности могу да се имплицитно конвертују у целе бројеве, у складу са мапирањем нетачано → 0 и тачано → 1 (на пример, true + true
би био израз који важи у вредновању до 2). Логички тип bool
у C++ сматра се за тип целог броја и он је хибрид између нумеричког типа и логичног типа.
Реални бројеви
[уреди | уреди извор]Реални број представља рационалан број ограничене прецизности који може имати разломљени део. Ови бројеви су интерно чувају у формату еквивалентном научној нотацији, обично у бинарном систему, али понекад и у декадном систему. Пошто реални бројеви имају ограничену прецизност, само подскупови реалних или рационалних бројева су егзактно представљени, остали бројеви могу бити представљени само приближно.
Многи језици имају и једноструку тачност (често називану float
) и двоструку тачност.
Литерали за реалне бројеве укључују децималну тачку, и обично користе „e“ или „E“ да означе научне записе. Примери реалних литерала су:
- 20.0005
- 99.9
- −5000.12
- 6.02e23
Неки језици (на пример, Фортран, Пајтон, D) такође имају тип комплексног броја који обухвата два реална броја: реални део и имагинарни део.
Бројеви фиксне запете
[уреди | уреди извор]Број фиксне запете представља рационалан број ограничене прецизности који може имати фракциони део. Ови бројеви се интерно чувају у скалирано-целој форми, ообично у бинарном систему, али понекад и у декадном систему. Зато што бројеви фиксног зареза имају ограничену прецизност, само подскупови реалних или рационалних бројева су потпуно представљени; остали бројеви могу бити представљени само приближно. Бројеви са фиксним зарезом такође имају тенденцију да имају ограниченији опсег вредности него они са покретном запетом, па програмер мора бити опрезан да избегне преливање (резултате који излазе из опсега који се могу представити) у међурачуну, као и у коначним резултатима.
Знакови и ниске
[уреди | уреди извор]Знаковни тип (обично char
) може да садржи једано слово, број, интерпукциски знак, симбол, код форматирања, контролни код, или неки други специјални код (нпр ознака наређења бита). У C, char
се дефинише као најмања адресабилна јединица меморије. У већини система ово је 8 бита; Неколико стандарда, попут Посикса, захтевају да буде ове величине. Неки језици имају две или више врста знакова, на пример једнобајтни тип за АСКИ знакове и мултибајтни тип Уникод знакова. Термин „тип знакова“ (енгл. character type) се обично користи чак и за типове чије вредности прецизније представљају кодови јединице, на пример UTF-16 као код јединице у Јави and Јаваскрипту.
Знакови могу да се комбинују у ниске. Подаци ниски могу да садрже бројеве и друге нумеричке симболе али ће се третирати као текст.
Ниске се имплементирају на различите начине, у зависности од програмског језика. Најједноставнији начин да се спроведе ниска је да се створи као низ знакова, након чега ће се користити ограничавајући знак да означи крај низа, обично НУЛ. Овакве ниске се називају нискама терминираним нулом, и обично се користе у језицима са малим нивоом хардверске апстракције (језици ближи машинском језику), као што су C и Асемблер. Иако их је лако имплементирати, ниске терминиране нулом имају ману због опасности од преливања бафера. Већина скрипт језика вишег нивоа, као што су Пајтон, Руби, и многи диалекти Бејсика, немају посебан тип знакова; ниске са дужином од једног знака обично се користе за представљање појединачних знакова. Неки језици, као што су C++ и Јава, имају могућност да користе ниске терминиране нулама (обично зарад уназадне компатибилности), али додатно обезбеђују своју класу за руковање нискама (std::string
и java.lang.
String
, редом) у својим стандардним библиотекама.
Такође постоји разлика у томе да ли су у језику ниске променљиве или непроменљиве. Променљиве ниске се могу мењати након њиховог стварања, док непроменљиве ниске одржавају константну величину и садржај. У другом случају, једини начин да се ниска промени је да се направи нова ниска. Постоје предности и мане оба приступа: иако су непроменљиве ниске много мање флексибилне, они су једноставније и безбедне у случају да се програм извршава у више нити. Неки примери језика који користе променљиве ниске укључују C++, Перл и Руби, док су језици који их не користе Јаваскрипт, Луа, и Го. Мали број језика, као што су Објектив-Ц, пружају различите типове за променљиве и непроменљиве ниске.
Литерали за знакове и ниске су обично окружени наводницима: понекад се, једноструки наводници (') користе за знакове а дупли наводници (") за ниске.
Примери знакова литерала у C синтакси су:
- 'A'
- '4'
- '$'
- '\t' (таб на тастатури)
Примери ниски литерала у C синтакси су::
- "A"
- "Здраво свете"
Опсези бројевних типова података
[уреди | уреди извор]Сваки тип нумеричког податка има максималне и минималне вредности познате као опсег. Покушај чувања броја изван опсега може довести до грешака било у време компајлирања било у време извршавања, или до погрешних резултата (због скраћења) у зависности од језика који се користи.
Опсег променљиве се заснива на броју бајтова који су се користили за чување вредности, и један целобројни тип података обично може да чува вредности (где представља број битова које чине вредност). За остале типове података (нпр вредности реалних бројева) питање опсега је много компликованије и варира у зависности од начина њиховог складиштења. Постоје и неке врсте које не користе целе бајтове, на пример бул коме је потребан само један бит, и представља вредност бинарног система (иако се у пракси често користи бајт и том приликом је преосталих 7 битова сувишно). Неки програмски језици (као што су Ада и Паскал) такође дозвољавају и супротан правац, то јест, програмер дефинише опсег и прецизност потребну да би се решио дати проблем а преводилац аутоматски бира најприкладнији цео или реалан тип.
Види још
[уреди | уреди извор]Референце
[уреди | уреди извор]- ^ "C++ Data Types".
- ^ а б Fog, Agner (16. 2. 2010). „Calling conventions for different C++ compilers and operating systems: Chapter 3, Data Representation” (PDF). Приступљено 30. 8. 2010.
- ^ Owens, Sean R. (5. 11. 2009). „Java and unsigned int, unsigned short, unsigned byte, unsigned long, etc. (Or rather, the lack thereof)”. Приступљено 5. 9. 2010.