Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания к КР.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.58 Mб
Скачать

Представление целых чисел без знака

Это всё очень просто: целое число без знака просто переводится в двоичную СС и слева дополняется незначащими нулями так, чтобы общее количество двоичных цифр равнялось  – длине ячейки памяти, выделяемой под величины заданного типа.

Представление целых чисел со знаком

В современных компьютерах целые числа хранятся в дополнительном коде. Помимо дополнительного кода в теории известны, а в недалёком прошлом применялись и в реальных ЭВМ, прямой и обратный (инверсный) коды.

Чтобы осознать, – чем отличается машинный двоичный код числа от записи этого числа в двоичной системе счисления, следует знать следующие факты.

  1. Запись числа в двоичной системе счисления, как и в десятичной, содержит только информационно необходимые цифры, незначащие нули практически никогда не записываются (за исключением специальных рассмотрений).

Машинный же код – это запись числа с помощью фиксированного количества разрядов – количества разрядов в выделяемой под число ячейки памяти ЭВМ. Например, однобайтные ячейки памяти содержат восьмибитные коды, при этом двоичное число 101 представляется в виде 00000101; это представление и называется однобайтным машинным кодом двоичного числа 101. Итак, машинный код положительного двоичного числа часто содержит незначащие лидирующие нули – это совсем просто!

  1. В двоичной системе счисления, как и в десятичной, положительные числа могут записываться и без знака, например, 101, и со знаком, например, +101. Отрицательные числа всегда записываются только со знаком, например, –101.

Машинные двоичные коды знаков не имеют, они состоят только из двоичных цифр, называемых битами.

  1. Общее количество кодов, представимых в k-битной ячейке памяти равно 2k. Действительно, первый бит порождает две комбинации (0 и 1), каждая из этих комбинаций может быть взята с каждой из двух таких же комбинаций второго бита – получаем 4 комбинации, каждая из этих четырёх комбинаций может быть взята с двумя комбинациями третьего бита – получаем 8=23 комбинации, и так далее до k-го бита.

  2. Первая половина кодов (их количество, естественно, равно 2k/2=2k-1) выделяется для хранения неотрицательных чисел – нуля и положительных значений. Вторая половина кодов (их тоже 2k-1) выделяется для хранения отрицательных чисел.

Замечательное следствие такого разделения кодов состоит в том, что коды всех неотрицательных чисел содержат в старшем (самом левом) бите ноль, а коды всех отрицательных чисел содержат в старшем бите единицу. Это следствие послужило основанием того, что во многих учебниках по информатике утверждается следующее: «… Старший разряд двоичного кода числа является знаковым: ноль кодирует знак плюс, а единица – знак минус». И скажите, что это не так!

  1. Естественно, любая последовательность бит может быть интерпретирована как беззнаковое число – положительное или ноль. Мы называем эту интерпретацию арифметическим значением двоичного машинного кода и обозначаем буквой U.

Интерпретационная формула машинного кода целого числа имеет вид:

(2)

Как видно из формулы (2), во всех кодах – и прямом, и обратном, и дополнительном хранимые положительные числа представляются таким образом, что арифметическое значение U двоичного машинного кода совпадает с хранимым значением Х.

Несложно догадаться, как получается двоичный машинный код неотрицательного числа – двоичное представление числа дополняется слева незначащими лидирующими нулями до k разрядов – длины ячейки памяти ЭВМ. С кодами отрицательных чисел несколько сложнее. В общем случае формулу генерации кода можно получить из формулы (2):

(3)

Если последние две строчки у вас не получаются, то заметим, что при имеем: и . Естественно, предполагается, что результаты вычислений записываются в виде последовательности k бит.

Прямой код – самый простой. В нём используется представление числа в привычной форме: «знак»«абсолютная величина». При этом старший разряд ячейки отводится под знак, а остальные – под двоичный код абсолютной величины. Например, прямые коды двоичных чисел 1001 и –1001 для 8-разрядной ячейки таковы: 00001001 и 10001001 соответственно.

Обратный код положительного числа совпадает с его прямым кодом. Обратный код отрицательного числа Х представляет собой двоичный код числа U = 2k – 1 – |Х|, где k – количество разрядов используемой ячейки памяти (в однобайтном формате k = 8). Код разности 2k – 1 представляет собой k единиц, поэтому разность 2k – 1 – |Х| получается очень просто: путём инвертирования разрядов прямого кода |Х| (единицы заменяются нулями, а нули – единицами). Таким образом, обратный код отрицательного числа образуется инвертированием разрядов прямого кода абсолютной величины этого числа. Например, обратный код двоичного числа –1001 для 8-разрядной ячейки таков: .

Дополнительный код положительного числа совпадает с его прямым кодом. Дополнительный код отрицательного числа Х представляет собой двоичный код числа U = 2k – |Х|, где k, по-прежнему, – количество разрядов используемой ячейки памяти. Нетрудно понять, что дополнительный код отрицательного числа может быть получен путём прибавления единицы к обратному коду этого числа. Например, дополнительный код двоичного числа –1001 для 8-разрядной ячейки таков: .