Загрузка данных


BITS = 8
MASK = (1 << BITS) - 1             # 0xFF
MIN_VAL = -(1 << (BITS - 1))       # -128
MAX_VAL = (1 << (BITS - 1)) - 1    # 127


def to_twos(x: int) -> int:
    """Число -> дополнительный код (беззнаковое машинное слово) с проверкой диапазона."""
    if not MIN_VAL <= x <= MAX_VAL:
        raise ValueError(f"{x} вне диапазона [{MIN_VAL}; {MAX_VAL}] для {BITS} бит")
    return x & MASK                # для отрицательных даёт 2^N + x


def from_twos(code: int) -> int:
    """Дополнительный код -> знаковое число."""
    return code - (1 << BITS) if code & (1 << (BITS - 1)) else code


def bin_str(code: int) -> str:
    return format(code, f"0{BITS}b")


def negate(code: int) -> int:
    """Дополнительный код противоположного числа: инверсия + 1."""
    return (~code + 1) & MASK


def add(a: int, b: int):
    """Сложение кодов с отбрасыванием переноса из старшего разряда.
    Возвращает (код результата, флаг переполнения)."""
    result = (a + b) & MASK
    sign = lambda c: (c >> (BITS - 1)) & 1
    # переполнение: знаки операндов равны, а знак результата отличается
    overflow = sign(a) == sign(b) and sign(result) != sign(a)
    return result, overflow


def report(title, a, b, res, ovf):
    print(f"\n{title}")
    print(f"  A   = {bin_str(a)} ({from_twos(a)})")
    print(f"  B   = {bin_str(b)} ({from_twos(b)})")
    print(f"  A+B = {bin_str(res)} (как знаковое: {from_twos(res)})")
    print("  Переполнение: " + ("ЕСТЬ" if ovf else "нет"))


x, y = 100, 50
cx, cy = to_twos(x), to_twos(y)

print(f"Разрядность: {BITS} бит, диапазон [{MIN_VAL}; {MAX_VAL}]")
print(f"{x} = {bin_str(cx)}")
print(f"{y} = {bin_str(cy)}")
print(f"-{y} = {bin_str(to_twos(-y))} (проверка через инверсию+1: {bin_str(negate(cy))})")

# Сложение 100 + 50
r1, o1 = add(cx, cy)
report(f"Сложение {x} + {y}:", cx, cy, r1, o1)
if o1:
    print(f"  Истинный результат {x + y} не помещается в {BITS} бит")

# Вычитание 100 - 50 = 100 + (-50)
cny = negate(cy)
r2, o2 = add(cx, cny)
report(f"Вычитание {x} - {y} как {x} + (-{y}):", cx, cny, r2, o2)

# Контроль в десятичной системе
print("\nКонтроль:")
print(f"  {x}+{y}={x + y}, в 8 бит: {from_twos(r1)} (переполнение подтверждено)")
print(f"  {x}-{y}={x - y}, в 8 бит: {from_twos(r2)} (совпадает)")