ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 2) онлайн

Беззнаковые типы данных

Если исключить из представления целых чисел знак, то полученный тип данных будет представлять неотрицательные целые числа с удвоенной верхней границей диапазона представления. Беззнаковые типы данных перечислены в табл. 2.3.

Беззнаковые типы данных применяются в тех случаях, когда нет необходи- мости хранить в переменных отрицательные значения, например при подсчете количества чего-либо, или в тех случаях, когда верхняя граница диапазона обыч- ного целого типа оказывается недостаточно велика.

Таблица 2.3. Беззнаковые целые типы

Название

Нижняя граница

диапазона

Верхняя граница

диапазона

Размер в байтах

unsigned char

0

255

1

unsigned short

0

65 535

2

unsigned int

0

4 294 967 295

4

unsigned long

0

4 294 967 295

4

Чтобы сделать (целый тип беззнаковым, предварите его название ключевым словом unsigned. Например, определение беззнаковой переменной типа char бу- дет выглядеть следующим образом:

unsigned char ucharVar;

Выход за рамки допустимых для данного типа значений, как правило, приво- дит к труднообнаруживаемым ошибкам. Подобные ошибки с беззнаковыми ти- пами происходят гораздо реже. Следующая программа хранит одно и то же зна- чение, равное 1 500 000 000, в переменных signedVar типа int и unsignVar типа unsigned int.

 

// signtest.cpp

// работа со знаковыми / беззнаковыми переменными #include <iostream> using namespace std;

int main() {

int signedVar = 1500000000;               //знаковая переменная

unsigned int unsignVar = 1500000000;     //беззнаковая переменная signedVar = (signedVar *2) / 3;          //выход за границы диапазона unsignVar = (unsignVar *2) / 3;          // вычисления внутри диапазона cout << "Знаковая переменная равна " << signedVar << endl;

                                         // вывод правильного результата cout << "Беззнаковая переменная равна " << unsignVar << endl;

                                         // вывод некорректного результата

return 0;

}

Программа умножает обе переменные на 2, а затем делит на 3. Несмотря на то, что правильный результат должен получиться меньше исходного значе- ния, промежуточное вычисление приводит к результату, большему, чем исход- ное число. Такая ситуация стандартна, но зачастую она приводит к ошибкам. Так, например, в программе SIGNTEST мы должны ожидать того, что в обеих переменных в итоге будет содержаться одно и то же значение, составляющее 2/3 от исходного и равное 1 000 000 000. Но результат умножения, равный 3 000 000 000, вышел за допустимый верхний предел для переменной signedVar, равный 2 147 483 647. Поэтому результат работы программы будет выглядеть следующим образом:

Знаковая переменная равна -431655765 Беззнаковая переменная равна 1000000000

Теперь в переменной со знаком содержится неверное значение, в то время как переменная без знака, которая имела достаточный диапазон для представле- ния результата умножения, содержит корректный результат. Отсюда следует вывод: необходимо следить за тем, чтобы все значения, которые вычисляются в вашей программе, соответствовали диапазонам значений тех переменных, ко- торым они присваиваются (при этом нужно учитывать, что на 16- и 64-битных компьютерах диапазоны даже для переменных типа int будут различными).

 

48