Теория:
Все операции над числами в памяти компьютера выполняются не над самими числами, а над их машинными кодами.
Рассмотрим получение машинного кода целого положительного числа.
Предположим, что мы имеем дело с шестнадцатиразрядной сеткой. Вычислим диапазон целых чисел, которые можно представить. для целого положительного числа, а вычислим по формуле:
Пример \(1\)
Запиши машинный код целого положительного числа \(547\) в шестнадцатиразрядной сетке.
1. Переведём число в двоичную систему счисления:
.
2. Дополним недостающие разряды незначащими нулями для заполнения сетки:
.
3. Машинный код числа принято представлять в шестнадцатеричной системе счисления, так людям его удобнее воспринимать: .
Ответ: .
Такой код принято называть прямым кодом числа и обозначать .
Рассмотрим получение машинного кода целого отрицательного числа.
Предположим, что мы имеем дело с шестнадцатиразрядной сеткой. Один из разрядов сетки, а именно самый старший разряд, будет отведён под хранение знака. Таким образом, для хранения самого числа у нас остаётся \(15\) разрядов. Вычислим диапазон целых чисел, которые можно представить. для целого положительного числа, а вычислим по формуле:
Предположим, что мы имеем дело с шестнадцатиразрядной сеткой. Один из разрядов сетки, а именно самый старший разряд, будет отведён под хранение знака. Таким образом, для хранения самого числа у нас остаётся \(15\) разрядов. Вычислим диапазон целых чисел, которые можно представить. для целого положительного числа, а вычислим по формуле:
Обрати внимание: если мы сложим и , то получим \(65535\). То есть диапазон представляемых чисел не изменился.
Целые отрицательные числа хранятся в памяти в виде машинного кода дополнения к модулю исходного числа. Делается это для того, чтобы заменить операцию вычитания операцией сложения.
Для получения дополнительного кода используется следующий алгоритм:
1. получить двоичное представление модуля отрицательного числа.
2. Инвертировать все разряды полученного двоичного числа.
3. Прибавить к инвертированному числу \(1\).
Пример \(2\)
Получи дополнительный код числа \(B = -125\) в восьмиразрядной сетке.
1. Получим двоичное представление модуля отрицательного числа:
.
2. Инвертируем все разряды полученного двоичного числа (\(0\) заменим \(1\), а \(1\) — \(0\)).
3. — это представление числа называется обратным кодом числа.
4. Прибавим к инвертированному числу \(1\).
— это и есть дополнительный код числа \(B\).
Ответ:
Обрати внимание!
Если сложить прямой и обратный коды отрицательного числа, мы получим \(2k\), где \(k\) равно количеству разрядов. А в самой \(k\)-разрядной сетке это число будет равно \(0\).
Пример \(3\)
Докажи верность высказывания: дополнительный код отрицательного числа — это дополнение модуля этого числа до \(2k\), где \(k\) равно количеству разрядов, или до \(0\) в \(k\)-разрядной арифметике.
Для доказательства воспользуемся числами, представленными в восьмиразрядной сетке.
1. Получим дополнительный код числа \(C = -56\).
Получим двоичное представление модуля отрицательного числа:
.
2. Инвертируем все разряды полученного двоичного числа (\(0\) заменим \(1\), а \(1\) — \(0\)).
3. — это представление числа называется обратным кодом числа.
4. Прибавим к инвертированному числу \(1\).
— это дополнительный код числа \(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\); единица, вышедшая за разрядную сетку, называется «переполнением». Переведя полученное число в десятичную систему счисления, мы убедимся, что получили . Что и требовалось доказать.
Обрати внимание!
Таким образом, мы можем получать дополнительный код вычитанием из переполненной разрядной сетки модуля заданного отрицательного числа.
Пример \(4\)
Получи дополнительный код числа \(B = -125\) в восьмиразрядной сетке.
1. Получим дополнение заданного числа до полной разрядной сетки:
.
2. Запишем полученное число в восьмиразрядной сетке, указав в старшем бите его знак:
.
Ответ: .
Пример \(5\)
Запиши машинный код целого отрицательного числа \(547\) в шестнадцатиразрядной сетке.
1. Переведём число в двоичную систему счисления:
.
2. Дополним недостающие разряды незначащими нулями для заполнения сетки:
.
3. Инвертируем все разряды полученного двоичного числа (\(0\) заменим \(1\), а \(1\) — \(0\)):
.
4. Прибавим к инвертированному числу \(1\).
— это дополнительный код числа \(A\).
5. Машинный код числа принято представлять в шестнадцатеричной системе счисления, так людям удобнее его воспринимать: .
Ответ: .
Обрати внимание!
Выводы:
• для положительного целого числа дополнительный код совпадает с прямым кодом числа.
• Для отрицательного целого числа дополнительный код является дополнением модуля этого числа до \(2k\), где \(k\) равно количеству разрядов.
• Сложение дополнительного кода отрицательного числа с модулем этого числа в \(k\)-разрядной арифметике даёт значение, равное нулю.
• для положительного целого числа дополнительный код совпадает с прямым кодом числа.
• Для отрицательного целого числа дополнительный код является дополнением модуля этого числа до \(2k\), где \(k\) равно количеству разрядов.
• Сложение дополнительного кода отрицательного числа с модулем этого числа в \(k\)-разрядной арифметике даёт значение, равное нулю.