Представление чисел в компьютере. Целые числа и их компьютерный код
Целые числа в компьютере
Вся информация, обрабатываемая современными компьютерами, хранится в них в
двоичном виде. Каждая ячейка памяти компьютера состоит из некоторого числа
однородных элементов, обладающих двумя устойчивыми состояниями, одно из которых
соответствует нулю, а другое — единице. Каждый элемент ячейки служит для
изображения одного разряда двоичного числа. Именно поэтому каждый элемент ячейки
называют
разрядом.
Беззнаковое представление положительных целых чисел в компьютере
Так как в компьютере все данные хранятся в двоичном виде, то чтобы получить
представление целого положительного числа в компьютере, сначала это число
необходимо перевести в двоичную систему счисления. Если двоичное число состоит
не более чем из k цифр, то это число можно записать в k-разрядной ячейке памяти, дополнив нулями слева до k
разрядов.
Запишем максимальные числа, которые можно вместить в 8, 16, 32 разрядах.
Количество разрядов |
Максимальное число |
8 |
28 – 1 = 255 |
16 |
216 – 1 = 65535 |
32 |
232 – 1 = 4294967295 |
Знаковое представление целых чисел в компьютере
Для человека привычна запись числа в виде
«знак-величина». Чтобы и в компьютере представлять числа в привычном для
человека виде, необходимо самый левый разряд ячейки отвести для записи знака
числа. При записи положительного числа в самый левый разряд ячейки, который
называется
знаковым, записывается 0, при записи отрицательного числа
1. То есть при знаковом представлении чисел 0 в самом левом разряде
ячейки соответствует знаку плюс, а единица – знаку минус. Очевидно, что модуль
числа можно записывать только в оставшихся
k – 1
разрядах. Такое представление чисел называется
прямым кодом.
- количество представимых чисел в k разрядах ограничено и
зависит от k;
- диапазон знаковых чисел, представимых в k-разрядной ячейке,
не симметричен относительно 0.
Запишем максимальные и минимальные числа, которые можно записать в 8, 16 и 32
разрядах при знаковом представлении.
Количество разрядов |
Минимальное число |
Максимальное число |
8 |
–27 = –128 |
27 – 1 = 127 |
16 |
–215 = –32768 |
215 – 1 = 32767 |
32 |
–231 = –2147483648 |
231 – 1 = 2147483647 |
Алгоритм построения дополнительного кода
В
k-разрядной целочисленной компьютерной арифметике 2
k = 0, так как единица в самом старшем разряде числа 2
k должна стоять в
k+1 разряде и следовательно,
«выползает» за границы ячейки. Дополнительный код отрицательного числа,
записанный в
k-разрядной ячейке, заменяет это отрицательное число
на дополнение его модуля до числа 2
k. То есть
дополнительный код отрицательного числа
m равен 2
k – |
m|. Такая замена позволяет заменить
операцию вычитания чисел на операцию сложения. Действительно, если в 8-разрядной
ячейке сложить числа 5 и –6, где вместо –6 написано число (2
8 – 6),
то получится 5 + (2
8 – 6) = 2
8 – 1, что будет
соответствовать записи числа –1.
Поэтому для
k-разрядной ячейки дополнительный код отрицательного
числа можно получить следующим образом:
- Модуль числа представляется прямым кодом в k разрядах.
- В прямом коде все нули заменяются на единицы, а единицы – на нули. Таким
образом получаем обратный код.
- К полученному обратному коду прибавляется единица.
Алгоритм получения числа по дополнительному коду
Иногда требуется по имеющемуся дополнительному коду числа восстановить исходное
число. Модуль искомого числа в таком случае можно получить двумя способами:
- Провести обратную цепочку преобразований: вычесть единицу из дополнительного
кода числа, инвертировать полученный результат и перевести его в десятичную
систему счисления.
- Построить дополнительный код для имеющегося дополнительного кода и перевести
результат в десятичную систему счисления.
Особенности целочисленной компьютерной арифметики
В связи с тем, что количество чисел, которые могут быть представлены в
k разрядах, ограничено, при выполнении арифметических действий в
целочисленной
k-разрядной арифметике могут возникнуть следующие
ситуации:
- Старшие цифры результата могут выйти за пределы
отведенных разрядов и будут утеряны.
- При сложении или умножении двух положительных
знаковых чисел можно получить отрицательное число.
Это произойдет в том случае, если в результате вычисления в знаковом бите
окажется единица. Подобные ситуации могут привести к неверному результату при
выполнении верных алгоритмов. Поэтому об этих особенностях всегда нужно помнить
при программировании.