Поскольку целые числа Python произвольно велики, необходимо замаскировать значения, чтобы ограничить преобразование тем количеством бит, которое вы хотите для представления дополнения 2s.
>>> hex(-199703103 & (2**32-1)) # 32-bit
'0xf418c5c1L'
>>> hex(-199703103 & (2**64-1)) # 64-bit
'0xfffffffff418c5c1L'
Python отображает простой случай hex(-199703103)
как отрицательное шестнадцатеричное значение (-0xbe73a3f
), потому что представление дополнения 2s будет иметь бесконечное число F перед ним для числа произвольной точности. Значение маски (2 ** 32-1 == 0xFFFFFFFF) ограничивает это:
FFF...FFFFFFFFFFFFFFFFFFFFFFFFF418c5c1
& FFFFFFFF
--------------------------------------
F418c5c1