В физических цепях ЭВМ информация передаётся дискретными электрическими потенциалами.
Суть: Единицы информации измеряют емкость физических ячеек и линий связи, но не определяют их смысл.
Один и тот же байт 11111111 в ячейке памяти процессора может интерпретироваться совершенно по-разному:
Беззнаковое число: $255_{10}$. Все 8 разрядов отвечают за величину числа.
Знаковое число в доп. коде: $-1_{10}$. Старший бит 1 означает отрицательный знак.
В кодовой таблице Windows-1251 код 0xFF соответствует букве «я».
Вывод: Процессор выполняет операции согласно коду команды, наделяя биты смыслом.
Для представления чисел со знаком в регистрах процессора старший бит (MSB) резервируется под знак: 0 — положительное число, 1 — отрицательное число.
Пошаговый разбор для числа $-43_{10}$ в 8-разрядной сетке:
10101011 (знаковый бит 1).11010100.
11010100
+ 00000001
----------
11010101 (дополнительный код числа -43)
Отрицательный вес старшего бита: $-128 + 64 + 16 + 4 + 1 = -43_{10}$.
Главное достоинство дополнительного кода: $A - B = A + [-B]_{доп}$. АЛУ не требует отдельной схемы вычитателя!
Пример: 58 - 43 (или 58 + (-43)) в 8-разрядном сумматоре:
1 1 1 1 1 (поразрядные переносы)
0 0 1 1 1 0 1 0 (+58)
+ 1 1 0 1 0 1 0 1 (-43 в доп. коде)
-----------------
1 0 0 0 0 1 1 1 1 (перенос 1 за пределы 8 бит отбрасывается)
В 8-битном регистре: 00001111 = 15 (десятичная проверка: 58 - 43 = 15).
После каждого арифметического действия в регистре флагов (FLAGS) фиксируются признаки:
Что произойдёт, если сложить два положительных числа $95_{10} + 65_{10}$ в 8-битном знаковом формате?
0 1 0 1 1 1 1 1 (+95)
+ 0 1 0 0 0 0 0 1 (+65)
-----------------
1 0 1 0 0 0 0 0 (-96 в знаковом int8 ?!)
Причина парадокса: $95 + 65 = 160$, что превышает максимальный лимит $+127$. Единица переноса попала в знаковый бит.
Аппаратная фиксация: $OF = C_6 \oplus C_7 = 1 \oplus 0 = 1$. Процессор выставил флаг знакового переполнения!
Выполняются над каждым битом параллельно и независимо (без переносов):
Сброс битов в 0. Умножение на 0 обнуляет разряд, на 1 сохраняет значение.
11011010 & 00001111 (маска) ---------- 00001010
Принудительная установка битов в 1 без изменения остальных разрядов.
11011010 | 00100001 (маска) ---------- 11111011
Инверсия состояний и управление битовыми триггерами:
Инвертирует биты там, где в маске стоит 1. Используется для обнуления регистров: XOR EAX, EAX быстрее записи нуля!
11011010 ^ 00000110 (маска) ---------- 11011100
Унарная операция: переворачивает все разряды на противоположные ($0 \to 1, 1 \to 0$). Базовый этап построения обратного кода.
~ 00101011 ---------- 11010100
Выполните сложение в тетради / на рабочем бланке:
1 0 1 1 0 1 1 0 (182_10)
+ 0 1 1 0 1 1 0 1 (109_10)
-----------------
? ? ? ? ? ? ? ? ?
В регистре состояния порта периферии находится байт 10101100.
Подсказка: используйте AND для сброса, OR для установки, XOR для переключения.
Для отрицательного числа $-27_{10}$ в 8-разрядной сетке:
Атрибуция: Мем «Mathjoke (10 types of people in the world)». Автор: MjolnirPants (Wikimedia Commons). Источник: Wikimedia Commons (File:Mathjoke.jpg). Лицензия: Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). Изменения: оптимизировано разрешение и конвертировано в офлайн Data URI без изменения содержания.