|   Войти

Типы данных. Переполнение.

В предыдущем уроке мы изучили основные типы целочисленных данных на языке С++, узнали, как создавать переменные соответствующего типа и, какие числа можно хранить в этих переменных.

Однако, иногда возникают ситуации, когда полученное в результате математической операции число, больше, чем может содержать переменная определенного типа. Например, для типа unsigned char максимально допустимое число – 255. Если мы к этому числу прибавим 1, то, казалось бы, должно получиться 256, но на самом деле получается 0. Почему так происходит? Сложим столбиком в двоичной форме числа 11111111 (255) и 1:

Как считать столбиком в двоичной форме? Точно также, как и в десятичной, только нужно помнить, что 1 + 1 =10, а 1 + 1 + 1 = 11. Начинаем сложение с самых правых чисел: 1 + 1 = 10, 0 пишем, а 1 запоминаем (эта единица отмечена красным). Ко второй справа единице добавляем 1, которую мы запомнили: получается 10, 0 пишем, 1 запоминаем и т.д… К последней единице (та, что слева) добавляем 1, которую мы запомнили на предыдущем шаге. Получаем 10. Это число записываем снизу. В результате получилось число 100000000, равное 256, если рассматривать его в десятичной форме. Но в типе unsigned char используется только 1 байт, состоящий из 8-ми двоичных разрядов (бит). В результате в этот байт помещаются 8 полученных нулей (они обведены красным прямоугольником), а девятый разряд 1 не помещается в нашу переменную. Число 00000000 в десятичной форме равно 0. В результате мы получили, что 255 + 1 = 0.

Рассмотрим другой пример сложим числа типа unsigned char 250 и 10 (в двоичной форме 11111010 и 1010 соответственно):

В результате получилось число 100000100, которое соответствует десятичному числу 260. Однако, старшая (девятая) единица снова не поместилась в один байт. Поэтому в переменной осталось число 00000100, равное 4 в десятичной форме. Итак, 250 + 10 = 4.

На самом деле такой результат не является ошибкой. Ни среда разработки, ни программа, ни операционная система никак не отреагируют на неверный результат, поскольку переполнение является обычной ситуацией в процессе работы центрального процессора или контроллера. За эту ошибку ответственен только программист, который неверно подобрал тип переменной. Поэтому необходимо внимательно подходить к выбору типа.

Скачайте следующую программу, написанную на языке C++, поместите скачанный файл TYPES02.CPP в папку C:\TCPP\BIN\.

Запустите DOSBox (Как настроить эту программу можно посмотреть ЗДЕСЬ ).

Нажмите клавишу F3. Выберите файл TYPES.CPP и нажмите клавишу Enter.

На экране должна появиться открытая программа TYPES02.CPP:

Эта программа демонстрирует возможности использования переменных нескольких типов. Разберем эту программу построчно:

Чтобы запустить программу, нажимаем комбинацию клавиш Alt+R, выбираем в появившемся меню пункт Run и нажимаем клавишу Enter. Ни в коем случае не нажимайте для запуска программы комбинацию клавиш Ctrl+F9 – это закроет DOSBox!

На экране появится результат работы программы:

При нажатии на любую клавишу программа закроется.

Для каждого типа мы видим два результата: первый результат имеет правильное значение, а второй нет, поскольку произошло переполнение.

Задание: 1) Какой будет результат сложения переменных a1 и b1 типа unsigned char, если a1=200, а b1=100? Внесите эти данные в программу, запустите ее и посмотрите результат. 2) Присвойте переменным свои значения и посмотрите результат. 3) вместо сложения, попробуйте другие операции: вычитание (-), умножение(*), деление (/).