Processing math: 100%

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

C++
C#

Распон целобројних типова

Многи програмски језици разликују више типова података чији је скуп вредности неки подскуп скупа целих бројева. Ти типови се разликују по меморијском простору одвојеном за запис сваког броја (а отуд и по распону вредности које се могу исрпавно представити типом). Ово значи да се пажљивим избором одговарајућег целобројног типа (најмањег типа чији је распон довољан да се представе све вредности које променљива може узети током извршавања програма), програм може да заузме мање меморије и брже приступа подацима. Обратно, некад је потребно рачунати са веома великим бројевима. Тада треба водити рачуна о томе да уобичајени, најчешће коришћени целобројни тип податка (тип int) може да буде недовољан за смештање таквих података. У таквој ситуацији важно је да се употреби неки тип чији је распон довољно широк да омогући представљање довољно великих целих бројева. Необраћање пажње на ове ситуације доводи до покушаја да се сувише велики позитиван (или сувише мали негативан) број смести у недовољно велики меморијски простор (тј. да покуша да се запише помоћу мање цифара него што је то потребно). Такав број ће бити неисправно записан у предвиђеном простору и таква ситуација се назива прекорачење (или у случају веома малог броја подкорачење). Проблем неће бити сигнализиран ни на који начин, програм наставља да ради као да је све у реду, али при читању неисправно записаног броја се добија погрешна вредност, што доводи до неочекиваног резултата рада читавог програма.

У неким ситуацијама знамо да ће све вредности које нека променљива моћи да има бити ненегативне, док некада знамо да могу бити и негативне. Неозначени (енгл. unsigned) типови података су они који омогућавају само запис ненегативних вредности, док означени (енгл. signed) типови података омогућавају запис и позитивних и негативних вредности.

Иако смо за представљање целих бројева до сада користили само тип int, у језику C++ постоје следећи целобројни типови.

тип распон
short [215,2151]=[32768,32767]
unsigned short [0,2161]=[0,65535]
int [231,2311][2.1109,2.1109]
unsigned int [0,2321][0,4,2109]
long long [263,2631][91018,91018]
unsigned long long [0,2641][0,1.81019]

Најмању и највећу дозвољену вредност која се може представити неким типом можемо добити функцијама numeric_limits<type>::min() и numeric_limits<type>::max() декларисаним у заглављу <limits> (нпр. за тип int те вредности можемо очитати позивима numeric_limits<int>::min() и numeric_limits<int>::max()) или читањем одговарајућих вредности из заглавља <climits> (нпр. за тип int то су вредности INT_MAX и INT_MIN).

Избор типа обично зависи од ограничења задатих у тексту задатка. Ако се применом неке аритметичке операције добије резултат који се не може представити одабраним типом података кажемо да долази до прекорачења. На пример, ако сабирамо две и две милијарде представљене променљивама типа int резултат четири милијарде је превелики да би се могао представити типом int и уместо њега, као резултат се добија неки негативан број.

У наредних неколико задатака биће потребно обратити пажњу на одабир целобројних типова и грешке прекорачења.

Распон целобројних типова

Многи програмски језици разликују више типова података чији је скуп вредности неки подскуп скупа целих бројева. Ти типови се разликују по меморијском простору одвојеном за запис сваког броја (а отуд и по распону вредности које се могу исрпавно представити типом). Ово значи да се пажљивим избором одговарајућег целобројног типа (најмањег типа чији је распон довољан да се представе све вредности које променљива може узети током извршавања програма), програм може да заузме мање меморије и брже приступа подацима. Обратно, некад је потребно рачунати са веома великим бројевима. Тада треба водити рачуна о томе да уобичајени, најчешће коришћени целобројни тип податка (тип int) може да буде недовољан за смештање таквих података. У таквој ситуацији важно је да се употреби неки тип чији је распон довољно широк да омогући представљање довољно великих целих бројева. Необраћање пажње на ове ситуације доводи до покушаја да се сувише велики позитиван (или сувише мали негативан) број смести у недовољно велики меморијски простор (тј. да покуша да се запише помоћу мање цифара него што је то потребно). Такав број ће бити неисправно записан у предвиђеном простору и таква ситуација се назива прекорачење (или у случају веома малог броја подкорачење). Проблем неће бити сигнализиран ни на који начин, програм наставља да ради као да је све у реду, али при читању неисправно записаног броја се добија погрешна вредност, што доводи до неочекиваног резултата рада читавог програма.

У неким ситуацијама знамо да ће све вредности које нека променљива моћи да има бити ненегативне, док некада знамо да могу бити и негативне. Неозначени (енгл. unsigned) типови података су они који омогућавају само запис ненегативних вредности, док означени (енгл. signed) типови података омогућавају запис и позитивних и негативних вредности.

Иако смо за представљање целих бројева до сада користили само тип int, у језику C# постоје следећи целобројни типови.

тип распон
sbyte [27,271]=[128,127]
byte [0,281]=[0,255]
short [215,2151]=[32768,32767]
ushort [0,2161]=[0,65535]
int [231,2311][2.1109,2.1109]
uint [0,2321][0,4,2109]
long [263,2631][91018,91018]
ulong [0,2641][0,1.81019]

Најмању и највећу дозвољену вредност која се може представити неким типом добијамо помоћу MinValue и MaxValue (нпр. за тип int те вредности можемо очитати помоћу int.MinValue и int.MaxValue).

Избор типа обично зависи од ограничења задатих у тексту задатка. Функције за конверзију унетог текста у број (нпр. int.Parse) пријављују грешку и извршавање програма се прекида ако корисник приликом уноса унесе неодговарајућу вредност. Ако се применом неке аритметичке операције добије резултат који се не може представити одабраним типом података долази до прекорачења. На пример, ако сабирамо две и две милијарде представљене променљивама типа int резултат четири милијарде је превелики да би се могао представити типом int и уместо њега, као резултат се добија неки негативан број.

У наредних неколико задатака биће потребно обратити пажњу на одабир целобројних типова и грешке прекорачења.