Мне кажется, что, если байт хранится в дополнении до двух, когда отрицательный, он также сохраняется в дополнении до двух, когда положительный. Одним из преимуществ продажи дополнения к двум является то, что представление положительных значений идентично их двоичному аналогу без знака. Например, 0001
равно +1 в любом представлении. Это означает, что на самом деле не имеет смысла чередовать формат данных между двоичным дополнением и двоичным знаком без знака в зависимости от того, является ли значение положительным.
Если вам интересно, есть ли простой способ повернуть два - закодированные байты в целочисленные значения со знаком, для этого можно использовать модуль struct
.
>>> import struct
>>> data = bytes([0xff, 0x59, 0x02, 0xf9, 0x01])
>>> struct.unpack("xxxbb", data)
(-7, 1)
Здесь значение «xxxbb» указывает, что первые три байта следует игнорировать, а следующие два байта числа со знаком, занимающие по 8 бит каждый.
Также можно распаковать данные, хранящиеся в списке строк, путем промежуточного преобразования в байты:
import struct
data = ["ff", "59", "02", "f9", "01"]
data = bytes(int(x, 16) for x in data)
print(struct.unpack("xxxbb", data))