ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 будут различными).
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
