Эта функция должна преобразовывать ваши числа в аппаратные целые числа.В зависимости от вашего приложения вам может потребоваться применить эту функцию на каждом этапе ваших операций.
def correct(value, bits, signed):
base = 1 << bits
value %= base
return value - base if signed and value.bit_length() == bits else value
Следующие функции быстрого вызова могут пригодиться для «приведения» значений в соответствующий диапазон:
byte, sbyte, word, sword, dword, sdword, qword, sqword = (
lambda v: correct(v, 8, False), lambda v: correct(v, 8, True),
lambda v: correct(v, 16, False), lambda v: correct(v, 16, True),
lambda v: correct(v, 32, False), lambda v: correct(v, 32, True),
lambda v: correct(v, 64, False), lambda v: correct(v, 64, True)
)
В качестве примера того, как вы могли бы их использовать, может быть воспроизведена ошибка, которую можно увидеть в C. Если написать цикл for, используя байт для вывода 0 - 255, цикл может никогда не закончиться.Следующая программа демонстрирует эту проблему:
#! /usr/bin/env python3
def main():
counter = 0
while counter < 256:
print(counter)
counter = byte(counter + 1)
def correct(value, bits, signed):
base = 1 << bits
value %= base
return value - base if signed and value.bit_length() == bits else value
byte, sbyte, word, sword, dword, sdword, qword, sqword = (
lambda v: correct(v, 8, False), lambda v: correct(v, 8, True),
lambda v: correct(v, 16, False), lambda v: correct(v, 16, True),
lambda v: correct(v, 32, False), lambda v: correct(v, 32, True),
lambda v: correct(v, 64, False), lambda v: correct(v, 64, True)
)
if __name__ == '__main__':
main()