Имитация целочисленного переполнения в Python - PullRequest
1 голос
/ 14 апреля 2020

Я работаю с Python и хотел бы смоделировать эффект приведения C / C ++ к целочисленному значению.

Например, если у меня есть число без знака 234 на 8 битах, Я хотел бы, чтобы формула преобразовала его в -22 (приведение со знаком), и еще одна функция для преобразования -22 в 234 (приведение без знака).

Я знаю, что numpy уже имеет функции для этого, но я хотел бы избежать этого.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Вы можете использовать побитовые операции на основе значения маски 2 ^ (n-1) (для знакового бита):

size   = 8
sign   = 1 << size-1

number   = 234
signed   = (number & sign-1) - (number & sign)
unsigned = (signed & sign-1) | (signed & sign)

print(signed)   # -22
print(unsigned) # 234
2 голосов
/ 14 апреля 2020

Вы можете легко создать такую ​​функцию самостоятельно:

def toInt8(value):
    valueUint8 = value & 255
    if valueUint8 & 128:
       return valueUint8 - 256
    return valueUint8

>>> toInt8(234)
-22

Вы можете создать версию, которая принимает число битов в качестве параметра, а не жестко кодируется как 8:

def toSignedInt(value, bits):
    valueUint8 = value & (2**bits - 1)
    if valueUint8 & 2**(bits-1):
       return valueUint8 - 2**bits
    return valueUint8

>>> toSignedInt(234, 8)
-22
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...