Теория:

Все операции над числами в памяти компьютера выполняются не над самими числами, а над их машинными кодами.

Рассмотрим получение машинного кода целого положительного числа.
Предположим, что мы имеем дело с шестнадцатиразрядной сеткой. Вычислим диапазон целых чисел, которые можно представить. Amin=0 для целого положительного числа, а Amax вычислим по формуле:

Amax = 216  1;Amax = 65535.
 
Пример \(1\)

Запиши машинный код целого положительного числа \(547\) в шестнадцатиразрядной сетке.
 
1. Переведём число в двоичную систему счисления:
 
54710 = 10001000112.
 
2. Дополним недостающие разряды незначащими нулями для заполнения сетки:

A = 00000010001000112.
 
3. Машинный код числа принято представлять в шестнадцатеричной системе счисления, так людям его удобнее воспринимать: KA =0223.
 
Ответ: KA =0223.
 
Такой код принято называть прямым кодом числа и обозначать [KA]ПК.
 
Рассмотрим получение машинного кода целого отрицательного числа. 
Предположим, что мы имеем дело с шестнадцатиразрядной сеткой. Один из разрядов сетки, а именно самый старший разряд, будет отведён под хранение знака. Таким образом, для хранения самого числа у нас остаётся \(15\) разрядов. Вычислим диапазон целых чисел, которые можно представить. Amin=215=32768 для целого положительного числа, а Amax вычислим по формуле:

Amax = 215  1;Amax = 32767.

Обрати внимание: если мы сложим Amin и Amax, то получим \(65535\). То есть диапазон представляемых чисел не изменился.
 
Целые отрицательные числа хранятся в памяти в виде машинного кода дополнения к модулю исходного числа. Делается это для того, чтобы заменить операцию вычитания операцией сложения.

Для получения дополнительного кода используется следующий алгоритм:

1. получить двоичное представление модуля отрицательного числа.
2. Инвертировать все разряды полученного двоичного числа.
3. Прибавить к инвертированному числу \(1\).
 
Пример \(2\)

Получи дополнительный код числа \(B = -125\) в восьмиразрядной сетке.
 
1. Получим двоичное представление модуля отрицательного числа:

[KB]ПК=011111012.
 
2. Инвертируем все разряды полученного двоичного числа (\(0\) заменим \(1\), а \(1\) — \(0\)).
 
3. [KB]ОК=100000102 — это представление числа называется обратным кодом числа.
 
4. Прибавим к инвертированному числу \(1\).

 [KB]ДК=100000112 — это и есть дополнительный код числа \(B\).

Ответ: [KB]ДК=100000112=8216.
 
Обрати внимание!
Если сложить прямой и обратный коды отрицательного числа, мы получим \(2k\), где \(k\) равно количеству разрядов. А в самой \(k\)-разрядной сетке это число будет равно \(0\).
Пример \(3\)
 
Докажи верность высказывания: дополнительный код отрицательного числа — это дополнение модуля этого числа до \(2k\), где \(k\) равно количеству разрядов, или до \(0\) в \(k\)-разрядной арифметике.
 
Для доказательства воспользуемся числами, представленными в восьмиразрядной сетке.
 
1. Получим дополнительный код числа \(C = -56\).
 
Получим двоичное представление модуля отрицательного числа:

[KC]ПК=001110002.
 
2. Инвертируем все разряды полученного двоичного числа (\(0\) заменим \(1\), а \(1\) — \(0\)).
 
3. [KC]ОК=110001112 — это представление числа называется обратным кодом числа.
 
4. Прибавим к инвертированному числу \(1\).

[KC]ДК=110010002 — это дополнительный код числа \(C\).
 
5. Сложим прямой и дополнительный коды числа \(C\).
 
 
\(0\)
\(0\)
\(1\)
\(1\)
\(1\)
\(0\)
\(0\)
\(0\)
\(+\)
\(1\)
\(1\)
\(0\)
\(0\)
\(1\)
\(0\)
\(0\)
\(0\)
\(1\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
\(0\)
 
Если пользоваться восьмиразрядной сеткой, мы получили значение, равное \(0\); единица, вышедшая за разрядную сетку, называется «переполнением». Переведя полученное число в десятичную систему счисления, мы убедимся, что получили 28. Что и требовалось доказать.
 
Обрати внимание!
Таким образом, мы можем получать дополнительный код вычитанием из переполненной разрядной сетки модуля заданного отрицательного числа.
Пример \(4\)
 
Получи дополнительный код числа \(B = -125\) в восьмиразрядной сетке.
 
1. Получим дополнение заданного числа до полной разрядной сетки:

128125=3.
 
2. Запишем полученное число в восьмиразрядной сетке, указав в старшем бите его знак:

[KB]ДК=100000112.
 
Ответ: [KB]ДК=100000112.
 
Пример \(5\)
 
Запиши машинный код целого отрицательного числа \(547\) в шестнадцатиразрядной сетке.
 
1. Переведём число в двоичную систему счисления:
 
54710 = 10001000112.
 
2. Дополним недостающие разряды незначащими нулями для заполнения сетки:

[KA]ПК=00000010001000112.
 
3. Инвертируем все разряды полученного двоичного числа (\(0\) заменим \(1\), а \(1\) — \(0\)):

[KA]ОК=11111101110111002.
 
4. Прибавим к инвертированному числу \(1\).

[KA]ДК=11111101110111012 — это дополнительный код числа \(A\).
 
5. Машинный код числа принято представлять в шестнадцатеричной системе счисления, так людям удобнее его воспринимать: [KA]ДК=FDDD.
 
Ответ: [KA]ДК=FDDD.
 
Обрати внимание!
Выводы:
• для положительного целого числа дополнительный код совпадает с прямым кодом числа.
• Для отрицательного целого числа дополнительный код является дополнением модуля этого числа до \(2k\), где \(k\) равно количеству разрядов.
• Сложение дополнительного кода отрицательного числа с модулем этого числа в \(k\)-разрядной арифметике даёт значение, равное нулю.