Отрицательные числа в целочисленной арифметике Python

Раздел: Операции с числами -> Целочисленная арифметика

Отрицательные числа: основы работы

В Python отрицательные целые числа записываются с префиксом минус: -5, -100. Все стандартные арифметические операции поддерживаются. Однако есть особенности, связанные с целочисленным делением и остатком.

Наиболее простой и надежный способ работы с отрицательными числами - задействовать встроенные операции Python без дополнительных библиотек.

a = -10
b = 3
print(a + b)  # -7
print(a - b)  # -13
print(a * b)  # -30
print(a / b)  # -3.3333333333333335 (вещественное)
print(a // b) # -4 (целочисленное деление, округление вниз)
print(a % b)  # 2 (остаток)
print(-a)     # 10

Python отрицательные числа (отрицательные числа в python)

Пояснение: целочисленное деление // для отрицательных чисел округляет результат в сторону минус бесконечности. Остаток % всегда неотрицательный, если делитель положителен. Это следует учитывать.

Как получить модуль (абсолютное значение) отрицательного числа?

Можно применить встроенную функцию abs(). Она возвращает неотрицательное значение.

num = -42
print(abs(num))  # 42

Цель: получение расстояния до нуля, нормализация.

Как определить знак числа (положительное, отрицательное, ноль)?

Можно создать собственную функцию sign:

def sign(x):
    if x > 0: return 1
    elif x < 0: return -1
    else: return 0

print(sign(-5))  # -1
print(sign(0))   # 0
print(sign(3))   # 1

В Python 3.11+ появился math.copysign, но он возвращает число со знаком другого числа, а не сам знак. Для получения знака как 1 или -1 удобнее написать свою функцию.

Как выполнить целочисленное деление с отрицательными числами, чтобы результат был корректным для конкретной задачи?

Если требуется деление с усечением в сторону нуля (как в C), можно применить int(a / b):

a, b = -10, 3
print(int(a / b))  # -3 (отбрасывание дробной части)

Но это меняет тип на float, затем на int. Для чисто целочисленного деления можно использовать math.trunc или // с корректировкой.

Проблема: стандартное // для отрицательных даёт -4, что может быть неожиданно.

Типичная ошибка: Путать поведение // с truncation. Рекомендуется проверять, какой тип округления нужен.

Как получить остаток от деления с отрицательными числами с тем же знаком, что и делимое?

В Python остаток % всегда имеет знак делителя. Если нужен остаток со знаком делимого, его можно вычислить через a - b * int(a / b):

a, b = -10, 3
rem = a - b * int(a / b)
print(rem)  # -1

Это даёт остаток, как в языках с усечением в сторону нуля.

Как проверить, является ли число отрицательным?

Условный оператор if x < 0: позволяет проверить отрицательность числа. Его можно сочетать с abs() для нормализации.

x = -7
if x < 0:
    print("Отрицательное")
else:
    print("Неотрицательное")

Как работать с отрицательными числами в битовых операциях?

Отрицательные числа в Python представлены в бесконечной двоичной дополнительной записи (two's complement). Битовые операции работают соответствующим образом.

a = -5  # ...11111011
print(bin(a & 0xFF))  # 0b11111011 (младшие 8 бит)
print(a >> 1)         # -3 (арифметический сдвиг)

Особенность: сдвиг вправо для отрицательных чисел сохраняет знак (арифметический сдвиг).

Как округлить отрицательное число вверх или вниз?

math.floor() всегда округляет вниз (к минус бесконечности), math.ceil() вверх (к плюс бесконечности). Для отрицательных чисел это важно.

import math
print(math.floor(-2.3))  # -3
print(math.ceil(-2.3))   # -2

Цель: точное округление в определённую сторону.

Путаница: floor округляет вниз, то есть для -2.3 вниз = -3 (меньше), ceil округляет вверх = -2 (больше).

Расширенные примеры работы с отрицательными числами

Пример 1: Арифметические операции с различными комбинациями знаков.

Пример
a, b = -15, 4
print(f"a = {a}, b = {b}")
print(f"Сложение: {a + b}")
print(f"Вычитание: {a - b}")
print(f"Умножение: {a * b}")
print(f"Деление: {a / b}")
print(f"Целочисленное деление: {a // b}")
print(f"Остаток: {a % b}")
a = -15, b = 4
Сложение: -11
Вычитание: -19
Умножение: -60
Деление: -3.75
Целочисленное деление: -4
Остаток: 1

Пояснение: Остаток 1, потому что -15 = 4 * (-4) + 1.

Пример 2: Сравнение чисел.

Пример
x, y = -10, -20
print(f"x = {x}, y = {y}")
print("x < y:", x < y)    # False, так как -10 > -20
print("x > y:", x > y)    # True
print("x == y:", x == y)  # False
x = -10, y = -20
x < y: False
x > y: True
x == y: False

Пример 3: Использование abs для нахождения расстояния.

Пример
points = [(-3, 7), (5, -2), (-1, -1)]
for p in points:
    dist = abs(p[0]) + abs(p[1])  # манхэттенское расстояние
    print(f"Точка {p}, расстояние от нуля: {dist}")
Точка (-3, 7), расстояние от нуля: 10
Точка (5, -2), расстояние от нуля: 7
Точка (-1, -1), расстояние от нуля: 2

Пример 4: Обработка отрицательных чисел в цикле.

Пример
count = 0
for num in range(-5, 6):
    if num < 0:
        count += 1
print(f"Количество отрицательных чисел: {count}")
Количество отрицательных чисел: 5

Пример 5: Преобразование строки в отрицательное число.

Пример
s = "-256"
num = int(s)
print(num, type(num))
-256 <class 'int'>

Если строка начинается с минуса, int корректно преобразует.

Пример 6: Использование math.copysign для присвоения знака.

Пример
import math
value = 5.5
sign = -1
result = math.copysign(value, sign)
print(result)  # -5.5
-5.5

Пример 7: Проверка, является ли число нулём или отрицательным.

Пример
def check_non_positive(num):
    if num <= 0:
        return "Меньше или равно нулю"
    else:
        return "Положительное"

print(check_non_positive(-3))
print(check_non_positive(0))
print(check_non_positive(5))
Меньше или равно нулю
Меньше или равно нулю
Положительное

Пример 8: Применение divmod для отрицательных.

Пример
print(divmod(-10, 3))  # (-4, 2)
(-4, 2)

Пояснение: divmod возвращает кортеж (частное, остаток). Для отрицательных чисел частное floor, остаток неотрицательный.

Отрицательные числа в Python - comments

En
Python отрицательные числа (python)