pasar - Cómo convertir firmado a entero sin signo en python
pasar de float a int python (3)
Digamos que tengo este número i = -6884376
. ¿Cómo me refiero a una variable sin signo? Algo así como (unsigned long)i
en C.
Para obtener el valor equivalente a tu conversión de C, solo a nivel de bit y con la máscara adecuada. por ejemplo, si el unsigned long
es de 32 bits:
>>> i = -6884376
>>> i & 0xffffffff
4288082920
o si es de 64 bits:
>>> i & 0xffffffffffffffff
18446744073702667240
Tenga en cuenta que aunque eso le da el valor que tendría en C, sigue siendo un valor con signo, por lo que cualquier cálculo posterior puede dar un resultado negativo y tendrá que continuar aplicando la máscara para simular un 32 o 64 cálculo de bit
Python no tiene tipos incorporados sin firmar. Puede usar operaciones matemáticas para calcular una nueva int que represente el valor que obtendría en C, pero no hay un "valor sin signo" de una int de Python. Python int es una abstracción de un valor entero, no un acceso directo a un entero de tamaño de byte fijo.
Asumiendo :
- Tienes representaciones complementarias de 2 en mente; y,
- Por
(unsigned long)
te refieres entero sin signo de 32 bits,
entonces solo necesita agregar 2**32 (or 1 << 32)
al valor negativo.
Por ejemplo, aplique esto a -1:
>>> -1
-1
>>> _ + 2**32
4294967295L
>>> bin(_)
''0b11111111111111111111111111111111''
La suposición n. ° 1 significa que quiere que -1 sea visto como una cadena sólida de 1 bit, y la suposición n. ° 2 significa que quiere 32 de ellos.
Sin embargo, nadie más que tú puedes decir cuáles son tus suposiciones ocultas. Si, por ejemplo, tiene representaciones de complemento de 1 en mente, entonces necesita aplicar el operador de ~
prefijo en su lugar. Los enteros de Python trabajan duro para dar la ilusión de usar una representación infinitamente amplia de complemento de 2 (como el complemento 2 normal, pero con un número infinito de "bits de signo").
Y para duplicar lo que hace el compilador de la plataforma C, puede usar el módulo ctypes
:
>>> import ctypes
>>> ctypes.c_ulong(-1) # stuff Python''s -1 into a C unsigned long
c_ulong(4294967295L)
>>> _.value
4294967295L
La unsigned long
de C pasa a ser 4 bytes en el cuadro que ejecutó esta muestra.