- •Предисловие
- •Глава 1. Основные понятия
- •1.1. Элементы языка программирования
- •1.2. Процесс создания программы
- •1.3. Первая программа
- •1.4. Состав программы
- •Глава 2. Средства разработки на C++
- •2.1. Системы Turbo C++ 3.0/Borland C++ 3.1
- •2.2. Система C++ Builder
- •Глава 3. Работа с числовыми данными
- •3.1. Целые типы
- •3.2. Числа с плавающей точкой
- •3.3. Ввод и вывод чисел
- •3.4. Логический тип и логические операции
- •3.5. Математические функции
- •Глава 4. Операторы. Ключевые слова
- •4.1. Операторы
- •4.2. Приоритеты операторов
- •4.3. Ключевые слова
- •4.4. Структура программы
- •4.5. Константы
- •Задачи - . Простейшие вычисления
- •Глава 5. Управление и циклы
- •5.1. Условный оператор
- •5.2. Операторы цикла
- •5.3. Переключатель
- •5.4. Операторы break и continue
- •Задачи -. Выбор и циклы
- •Глава 6. Массивы
- •6.1. Одномерные массивы
- •6.2. Двумерные массивы
- •Задачи -. Одно- и двумерные массивы
- •Глава 7. Функции
- •7.1. Определение функции
- •7.2. Формальные параметры и фактические аргументы
- •7.3. Автоматические и статические переменные
- •7.4. Прототипы функций
- •7.5. Массивы как аргументы функций
- •7.6. Внешние переменные
- •7.7. Рекурсия
- •7.8. Перегруженные имена функций
- •7.9. Аргументы функций по умолчанию
- •Задачи -. Функции
- •Глава 8. Символы и строки
- •8.1. Символы
- •8.2. Строки символов
- •Задачи -. Символы и строки
- •Глава 9. Препроцессор
- •9.1. Директивы препроцессора
- •9.2. Макросы
- •Задачи -. Макросы
- •Глава 10. Указатели и ссылки
- •10.1. Указатели и адреса
- •10.2. Указатели и массивы
- •10.3. Адресная арифметика
- •10.4. Символьные указатели
- •10.5. Массивы указателей
- •10.6. Указатели на функции
- •10.7. Ссылки
- •10.8. Операторы new и delete
- •Задачи -. Указатели и ссылки
- •Глава 11. О файлах и командной строке
- •11.1. Знакомство с файлами
- •11.2. Командная строка
- •11.3. Перенаправление стандартного ввода и вывода на файл
- •11.4. Аргументы командной строки
- •Задачи -. Файлы и командная строка
- •Глава 12. Работа с экраном дисплея
- •12.1. Текстовый режим
- •12.2. Графический режим
- •Задачи -. Работа с экраном
- •Глава 13. Внутреннее представление чисел
- •13.1. Двоичная система счисления
- •13.2. Беззнаковые целые
- •13.3. Двоичный дополнительный код
- •13.4. Двоичный код с избытком
- •13.5. Побитовые операторы
- •13.6. Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8. Преобразование типов
- •Задачи -. Побитовые операторы
- •Глава 14. Структуры, перечисления, объединения
- •14.1. Объявление структур
- •14.2. Структуры и функции
- •14.3. Указатели на структуры
- •14.4. Массивы структур
- •14.5. Перечисления
- •14.6. Объединения
- •14.7. Битовые поля
- •14.8. О бинарных файлах
- •Задачи -. Структуры
- •Глава 15. Классы
- •15.1. Структуры в C++. Инкапсуляция
- •15.2. Встроенные функции
- •15.3. Классы. Скрытие данных
- •15.4. Конструкторы
- •15.5. Статические члены класса
- •15.6. Друзья класса
- •15.7. Копирование объектов класса
- •15.8. Управление доступом
- •15.9. Ссылка на себя
- •15.10. Деструкторы
- •Задачи -. Работа с классами
- •Глава 16. Программы из нескольких файлов
- •16.1. Работа с проектами
- •16.2. Область действия имен
- •16.3. Заголовочные файлы
- •16.4. Пространства имен
- •Задачи -. Работа со стеком
- •Глава 17. Перегрузка операторов
- •17.1. Правила перегрузки операторов
- •Задачи -. Перегрузка операторов
- •Глава 18. Конструктор копирования и оператор присваивания
- •18.1. Проблемы при копировании
- •Задачи -. Конструктор копирования
- •Глава 19. Ввод и вывод
- •19.1. Вывод
- •19.2. Ввод
- •19.3. Ввод и вывод определяемых пользователем типов
- •19.4. Работа с файлами
- •Глава 20. Взаимоотношения классов
- •20.1. Объекты как члены класса
- •20.2. Конструкторы встроенных типов
- •20.3. Наследование
- •20.4. Виртуальные функции
- •20.5. Абстрактные классы
- •20.6. Совместимость типов
- •20.7. Множественное наследование
- •Задачи -. Наследование классов
- •Глава 21. Шаблоны, исключения
- •21.1. Шаблоны
- •21.2. Шаблоны функций
- •21.3. Классы и шаблоны
- •21.4. Обработка исключений
- •21.5. Стандартная библиотека шаблонов
- •Литература
- •Предметный указатель
156
Глава 13. Внутреннее представление чисел
13.1. Двоичная система счисления
Числа, символы, изображения, звуки кодируются в компьютерах в виде последовательностей битов, которые могут находиться в двух различных состояниях. Эти состояния удобно описывать двумя значениями 0 и 1 и считать цифрами, а последовательности этих цифр рассматривать как числа, представленные в двоичной системе счисления. Числа в двоичной системе счисления, так же, как и в десятичной, представляются последовательностью цифр (нулей и единиц), имеющих различный «вес», определяемый положением цифры в числе. В десятичной системе в качестве «веса» цифры используется степень 10, а в двоичной – степень 2. Вес или старшинство цифры возрастает справа налево. В этом же направлении нумеруются разряды, причем нумерация начинается с 0. В табл.45 показаны цифры двоичного числа 01001110 и веса его цифр.
Таблица 46. Веса двоичных цифр
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Цифра |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
Вес цифры |
27=128 26=64 25=32 24=16 23=8 22=4 21=2 20=1 |
Для получения значения числа в десятичной системе следует умножить веса на значения цифр и сложить:
01001110 = 0×128 + 1×64 + 0×32 + 0×16 + 1×8 + 1×4 + 1×2 + 0×1 = 78.
Двоичные цифры числа получаются путем последовательного деления числа на 2 и нахождения остатков от деления, табл.47.
Таблица 48. Получение двоичных цифр
Частное 78/2 = 39 39/2 = 19 |
19/2 = 9 |
9/2 = 4 |
4/2 = 2 |
2/2 = 1 |
1 / 2 = 0 |
||
Остато |
78%2 = |
39%2 = |
19%2 = |
9%2 = |
4%2 = |
2%2 = |
1%2 = 1 |
к |
0 |
1 |
1 |
1 |
0 |
0 |
|
Цифра |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
Деление числа производится до тех пор, пока не получится нуль. Цифры выписываются в обратном порядке.
Внутреннее представление чисел |
157 |
13.2. Беззнаковые целые
Беззнаковые целые типы имеют неотрицательные значения. Рассмотрим в качестве примера внутреннее представление типа unsigned char, представление остальных беззнаковых типов (unsigned short, unsigned int, unsigned long) аналогично. Под данные типа unsigned char отводится 1 байт памяти, состоящий из 8 битов или разрядов. Эти разряды могут образовывать
28 = 256 различных комбинаций из нулей и единиц:
00000000, 00000001, …, 11111111.
Данные комбинации рассматриваются как двоичные числа со значениями:
0, 1, 2, …, 255. Наибольшее значение 255 равно:
28 – 1.
В общем случае, если n – количество двоичных разрядов, отводимых для беззнакового типа, то наибольшее значение этого типа равно:
2n – 1.
При вычислениях с беззнаковыми целыми используется арифметика по модулю 2n, то есть в качестве результата любой операции берется остаток от деления на 2n, который может иметь значения от 0 до 2n – 1, поэтому при вычислениях не может быть переполнения.
Рассмотрим сложение двух чисел 100 и 200 типа unsigned char. Найдем их двоичное представление в виде 8 двоичных цифр, рис.55, 56.
10010 |
= 011001002 |
12620- |
|
|
Рис.55. Получение двоичного представления для числа 100
158 13
20010 = 110010002
2002 |
- |
Рис.56. Получение двоичного представления для числа 200
Обратим внимание, что двоичное представление для 200 получается из двоичного представления для 100 путем сдвига всех его разрядов влево на 1 позицию.
Выполним сложение этих числе столбиком:
+ 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0
Для старшей единицы не хватает разряда, поэтому она отбрасывается, в результате получаем:
10010 + 20010 = 001011002 = 32+8+4 = 4410. Найдем теперь разность 100 - 200:
–0 1 1 0 0 1 0 0
1 1 0 0 1 0 0 0
1 0 0 1 1 1 0 0
Здесь выполняется заем из несуществующего девятого разряда, в результате получается:
10010 – 20010 = 100111002 = 128 + 16 + 8 + 4 = 15610.
13.3. Двоичный дополнительный код
Рассмотрим теперь знаковый тип char. Здесь часть битовых комбинаций рассматриваются как положительные числа, а часть как отрицательные. В качестве нуля и положительных чисел принимаются битовые комбинации:
00000000, 00000001,…, 01111111.
Внутреннее представление чисел |
159 |
Эти комбинации рассматриваются как числа в двоичной системе счисления со значениями:
0, 1, 2, …, 127.
Для отрицательных чисел остаются комбинации: 10000000. 10000001, 10000010, …, 11111111,
у которых старший разряд равен 1. Данным комбинациям можно поставить в соответствие отрицательные числа различными способами. Наиболее удобным оказался дополнительный код, показанный в табл.49.
Таблица 49. Двоичный дополнительный код
Битовая |
Числово |
Битовая |
Числовое |
комбинация |
е |
комбинация значение |
|
|
значение |
1000 0000 |
–128 |
|
|
||
0111 1111 |
127 |
1000 0001 |
–127 |
0111 1110 |
126 |
1000 0010 |
–126 |
… |
… |
… |
… |
0000 0111 |
7 |
1111 1001 |
-7 |
0000 0110 |
6 |
1111 1010 |
–6 |
0000 0101 |
5 |
1111 1011 |
–5 |
0000 0100 |
4 |
1111 1100 |
–4 |
0000 0011 |
3 |
1111 1101 |
–3 |
0000 0010 |
2 |
1111 1110 |
–2 |
0000 0001 |
1 |
1111 1111 |
–1 |
0000 0000 |
0 |
|
|
Сравнивая комбинации для положительных и отрицательных чисел, замечаем, что старшие разряды одинаковых по модулю чисел являются обратными или дополнительными по отношению друг к другу, то есть 0 заменяется 1 и наоборот, младшие же разряды одинаковы. Отсюда вытекает следующее правило:
для получения представления абсолютного значения какого-либо отрицательного числа нужно выписать разряды справа, включая первую 1, а все разряды после первой 1 заменить на обратные; для получения представления какого-либо отрицательного числа нужно выписывать разряды для его модуля вплоть до первой 1, а остальные разряды заменить на обратные.
Можно сформулировать и другое правило: