English
Binary addition
Add column by column from the right, carrying as in denary:
| Bit A |
Bit B |
Carry in |
Sum bit |
Carry out |
| 0 |
0 |
0 |
0 |
0 |
| 0 |
0 |
1 |
1 |
0 |
| 0 |
1 |
0 |
1 |
0 |
| 0 |
1 |
1 |
0 |
1 |
| 1 |
1 |
0 |
0 |
1 |
| 1 |
1 |
1 |
1 |
1 |
Overflow 溢出 happens when the result needs more bits than the register 寄存器 can hold — the carry-out of the leftmost column is the overflow bit.
Worked example. Add the 8-bit unsigned integers $10110101$ and $01101100$, and comment on the result.
$10110101 + 01101100 = 1\,00100001$. The answer needs 9 bits, so it does not fit in an 8-bit register: overflow has occurred. A full answer names the error and says why, using the word size the question gave: "Overflow: the true result ($289$) is larger than the largest value an 8-bit register can hold ($255$), so the carry out of the most significant bit is lost and the stored result ($00100001 = 33$) is wrong."
Binary subtraction
The usual way is two's complement 补码 addition: to do $A - B$, form the two's complement of $B$ (invert every bit and add 1), then add, and discard any final carry-out.
To subtract $00011110$ from $01100100$ (unsigned 8-bit):
- two's complement of $00011110$: invert → $11100001$, add 1 → $11100010$.
- add to $01100100$: result $1\,01000110$ (9 bits) — discard the leading 1 → $01000110 = 70_{10}$. Check: $100 - 30 = 70$. ✓
Two's complement signed integers
In an $n$-bit two's-complement number:
- the most significant bit 最高有效位 (MSB) is the sign bit 符号位: 0 = positive, 1 = negative.
- to read a negative number: invert every bit, add 1, then negate.
So $11100010$ is negative; invert → $00011101$, add 1 → $00011110 = 30$, so it is $-30$. This is a signed integer 有符号整数 (unlike an unsigned 无符号 one). The range for $n$ bits is $-2^{n-1}$ to $+2^{n-1} - 1$; for 8 bits, $-128$ ($10000000$) to $+127$ ($01111111$).
The same bits mean different numbers depending on the agreed reading. As an unsigned integer every bit is a place value, so 8 bits run from $0$ to $255$; as a signed two's-complement integer the top bit is the sign, so the same 8 bits run from $-128$ to $+127$. The pattern $11111111$ is $255$ read one way and $-1$ read the other — nothing in the bits themselves says which.
The same byte read as unsigned and as signed: only the agreed interpretation tells them apart
8-bit two's complement: the sign bit splits the range into negative ($-128$ to $-1$) and positive ($0$ to $127$)
Worked example. What denary value does the 8-bit two's-complement number $10110100$ represent?
The MSB is 1, so it is negative. Invert → $01001011$, add 1 → $01001100 = 76$, so the value is $-76$. Check with place values: $-128 + 32 + 16 + 4 = -76$.
Worked example. Write $-108$ as a 12-bit two's-complement integer.
Start from $+108$ in 12 bits: $108 = 64 + 32 + 8 + 4$, so 0000 0110 1100. Invert every bit: 1111 1001 0011. Add 1: 1111 1001 0100. Check with place values, where the top bit is worth $-2^{11} = -2048$: $-2048 + 1024 + 512 + 256 + 128 + 16 + 4 = -108$. ✓
For 12 bits the range is $-2048$ (1000 0000 0000) to $+2047$ (0111 1111 1111). Questions that ask for the smallest and largest values want these two patterns, so learn the rule: the most negative number is a 1 followed by zeros; the most positive is a 0 followed by ones.
An arithmetic shift 算术移位 moves every bit left or right but keeps the sign: a shift right by one place halves the value and copies the sign bit into the empty space on the left, so a negative number stays negative (1111 1001 0100 shifted right three places is 1111 1111 0010, which is $-14$: $-108 / 8 = -13.5$, and a shift right rounds down). A shift left doubles the value. Shifts belong to the assembly instruction set in topic 4, but this question is asked with the number work here.
Overflow in signed arithmetic happens when the true result falls outside this range — spotted when the sign bit flips wrongly (two positives giving a negative, or two negatives giving a positive).
One's complement
Before two's complement, an older scheme called one's complement 反码 represented a negative number by simply inverting every bit of the positive — there is no "add 1" step.
- $+30 = 00011110$, so in one's complement $-30 = 11100001$ (just the inverse).
- Drawback: it has two zeros — $00000000$ ($+0$) and $11111111$ ($-0$) — which wastes a bit pattern and makes arithmetic awkward.
Two's complement (invert and add 1) removes the negative zero: it has a single zero and lets addition and subtraction use the same circuit. That is why modern computers store signed integers in two's complement, not one's complement.
Русский
Двоичное сложение
Складывайте по столбцам справа налево, перенося разряды так же, как в десятичной системе:
| Бит A |
Бит B |
Перенос |
Сумма |
Перенос наружу |
| 0 |
0 |
0 |
0 |
0 |
| 0 |
0 |
1 |
1 |
0 |
| 0 |
1 |
0 |
1 |
0 |
| 0 |
1 |
1 |
0 |
1 |
| 1 |
1 |
0 |
0 |
1 |
| 1 |
1 |
1 |
1 |
1 |
Переполнение происходит, когда результат требует больше битов, чем может вместить регистр — перенос наружу самого левого столбца является битом переполнения.
Разобранный пример. Сложите 8-битные беззнаковые целые числа $10110101$ и $01101100$ и прокомментируйте результат.
$10110101 + 01101100 = 1\,00100001$. Ответ требует 9 бит, поэтому он не помещается в 8-битный регистр: произошло переполнение. Полный ответ должен назвать ошибку и объяснить причину, используя указанную в вопросе разрядность: «Переполнение: истинный результат ($289$) больше максимального значения, которое может хранить 8-битный регистр ($255$), поэтому перенос из старшего бита теряется, а сохранённый результат ($00100001 = 33$) неверен».
Вычитание в двоичной системе
Обычный способ — сложение с дополнительным кодом: чтобы выполнить $A - B$, нужно образовать дополнительный код для $B$ (инвертировать каждый бит и прибавить 1), затем сложить и отбросить любой финальный перенос.
Чтобы вычесть $00011110$ из $01100100$ (беззнаковые 8-битные числа):
- дополнительный код для $00011110$: инверсия → $11100001$, прибавление 1 → $11100010$.
- добавить к $01100100$: результат $1\,01000110$ (9 бит) — отбросить старший 1 → $01000110 = 70_{10}$. Проверка: $100 - 30 = 70$. ✓
Знаковые целые числа в дополнительном коде
В $n$-битном числе в дополнительном коде:
- старший бит (MSB) является знакомым битом: 0 = положительное, 1 = отрицательное.
- чтобы прочитать отрицательное число: инвертируйте каждый бит, прибавьте 1, затем измените знак.
Таким образом, $11100010$ — отрицательное; инверсия → $00011101$, прибавление 1 → $00011110 = 30$, значит оно равно $-30$. Это знаковое целое число (в отличие от беззнакового). Диапазон для $n$ бит составляет от $-2^{n-1}$ до $+2^{n-1} - 1$; для 8 бит — от $-128$ ($10000000$) до $+127$ ($01111111$).
Одни и те же биты означают разные числа в зависимости от согласованного способа чтения. Как беззнаковое целое число каждый бит представляет разрядное значение, поэтому 8 бит охватывают диапазон от $0$ до $255$; как знаковое число в дополнительном коде верхний бит является знаковым, поэтому те же 8 бит охватывают диапазон от $-128$ до $+127$. Паттерн $11111111$ читается как $255$ одним способом и как $-1$ другим — сами по себе биты не указывают, какой именно.
Один и тот же байт, прочитанный как беззнаковый и как знаковый: различить их можно только по согласованной интерпретации
8-битное число в дополнительном коде: знаковый бит делит диапазон на отрицательные ($-128$ до $-1$) и положительные ($0$ до $127$)
Разобранный пример. Какое десятичное значение представляет 8-битное число в дополнительном коде $10110100$?
Старший бит равен 1, значит число отрицательное. Инверсия → $01001011$, прибавление 1 → $01001100 = 76$, значит значение равно $-76$. Проверка с использованием разрядных значений: $-128 + 32 + 16 + 4 = -76$.
Разобранный пример. Запишите $-108$ как 12-битное число в дополнительном коде.
Начните со $+108$ в 12 битах: $108 = 64 + 32 + 8 + 4$, значит 0000 0110 1100. Инвертируйте каждый бит: 1111 1001 0011. Прибавьте 1: 1111 1001 0100. Проверка с помощью значений разрядов, где старший бит равен $-2^{11} = -2048$: $-2048 + 1024 + 512 + 256 + 128 + 16 + 4 = -108$. ✓
Для 12 бит диапазон составляет от $-2048$ (1000 0000 0000) до $+2047$ (0111 1111 1111). Вопросы, требующие найти наименьшее и наибольшее значения, имеют в виду эти два паттерна, поэтому запомните правило: самое отрицательное число — это 1, за которым следуют нули; самое положительное — это 0, за которым следуют единицы.
Арифметический сдвиг перемещает все биты влево или вправо, сохраняя знак: сдвиг вправо на один разряд делит значение пополам и копирует знаковый бит в освободившееся место слева, поэтому отрицательное число остаётся отрицательным (1111 1001 0100, сдвинутый вправо на три разряда, становится 1111 1111 0010, что равно $-14$: $-108 / 8 = -13.5$, а сдвиг вправо округляет вниз). Сдвиг влево удваивает значение. Сдвиги относятся к набору инструкций ассемблера в теме 4, но этот вопрос задан с использованием работы с числами здесь.
Переполнение в знаковой арифметике происходит, когда истинный результат выходит за пределы этого диапазона — обнаруживается, когда знаковый бит неправильно меняется (два положительных дают отрицательное, или два отрицательных дают положительное).
Обратный код
До появления дополнительного кода более старая схема под названием обратный код представляла отрицательное число простым инвертированием каждого бита положительного — нет шага «прибавить 1».
- $+30 = 00011110$, значит в обратном коде это $-30 = 11100001$ (просто инверсия).
- Недостаток: в нём два нуля — $00000000$ ($+0$) и $11111111$ ($-0$), что тратит битовый шаблон и затрудняет арифметику.
Дополнительный код (инверсия и прибавление 1) устраняет отрицательный ноль: в нём只有一个 ноль, и он позволяет использовать одну и ту же схему для сложения и вычитания. Именно поэтому современные компьютеры хранят знаковые целые числа в дополнительном коде, а не в обратном.