Как выполнить декремент байта равным 0 в Python?

Имеется кусок кода на Python:

>>> bt2 = bytearray(2)
>>> bt2[0] -= 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: byte must be in range(0, 256)
>>> bt2[1] -= 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: byte must be in range(0, 256)

Для меня это неожиданное поведение. В виду того, что у меня есть опыт разработки на языке ассемблера архитектуры x86-64 я ожидаю, что при уменьшении байта равным 0x0 на 1 получу значение 0xFF. А если увеличу байт равным 0xFF на 1, то получу 0x0. Но вместо этого вижу брошенное ValueError.

У меня два вопроса:

  1. Есть ли в Python возможность эмулировать "байты", то есть при декременте 0x0 получить 0xFF ?
  2. Почему в Python подобное поведение?

Ответы (2 шт):

Автор решения: SVBazuev

Как вариант:

def decrement_byte(b: int, flag: str) -> int:
    
    if flag == "+":
        return (b + 1) % 256
    elif flag == "-":
        return (b - 1) % 256
    else:
        raise ValueError("flag must be either '+' or '-'")


bt2 = bytearray(2)
print(bt2[0])  # Вывод: 0

bt2[0] = decrement_byte(bt2[0], "-")
print(bt2[0])  # Вывод: 255

bt2[0] = decrement_byte(bt2[0], "+")
print(bt2[0])  # Вывод: 0

Четкое ограничение значений байтов помогает избежать ошибок, связанных с переполнением и неожиданным поведением, которое может возникнуть в языках низкого уровня.

→ Ссылка
Автор решения: Amgarak

Можно воспользоваться numpy

import numpy as np

bt2 = np.zeros(2, dtype=np.uint8)
print(bt2)  # [0 0]

bt2[0] -= 1
print(bt2)  # [255   0]

bt2[1] -= 1
print(bt2)  # [255 255]

bt2[0] += 1
print(bt2)  # [  0 255]

bt2[1] += 1
print(bt2)  # [0 0]

bt2 = bytearray(bt2) 
print(bt2) # bytearray(b'\x00\x00')
→ Ссылка