# signed to unsigned

Discussion in 'Python' started by Brad Tilley, Feb 17, 2012.

In C or C++, I can do this for integer conversion:

unsigned int j = -327681234; // Notice this is signed.

j will equal 3967286062. I thought with Python that I could use struct
to pack the signed int as an unsigned int, but that fails:

>>> x = struct.pack("<I", -327681234)

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: integer out of range for 'I' format code

Is there an easy way in Python to do the same conversion that C or C++
code does? Thanks for any advice.

2. ### Chris RebertGuest

On Fri, Feb 17, 2012 at 10:51 AM, Brad Tilley <> wrote:
> In C or C++, I can do this for integer conversion:
>
> unsigned int j = -327681234; // Notice this is signed.
>
> j will equal 3967286062. I thought with Python that I could use struct
> to pack the signed int as an unsigned int, but that fails:
>
>>>> x = struct.pack("<I", -327681234)

> Traceback (most recent call last):
> Â File "<stdin>", line 1, in <module>
> struct.error: integer out of range for 'I' format code
>
> Is there an easy way in Python to do the same conversion that C or C++
> code does? Thanks for any advice.

Pack it as the actual type, then unpack it as the desired type:

Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
>>> from struct import pack, unpack
>>> unpack('=I', pack('=i',-327681234))

(3967286062,)

I would think there's some more efficient way to do this though.

Cheers,
Chris

Chris Rebert, Feb 17, 2012

> Pack it as the actual type, then unpack it as the desired type:
>
> Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
> >>> unpack('=I', pack('=i',-327681234))

>
> (3967286062,)
>
> I would think there's some more efficient way to do this though.
>
> Cheers,
> Chris

Thanks Chris! I was doing it backwards. I only have a few of these
right now, so performance isn't a concern. I appreciate the advice.

4. ### Peter OttenGuest

> In C or C++, I can do this for integer conversion:
>
> unsigned int j = -327681234; // Notice this is signed.
>
> j will equal 3967286062. I thought with Python that I could use struct
> to pack the signed int as an unsigned int, but that fails:
>
>>>> x = struct.pack("<I", -327681234)

> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> struct.error: integer out of range for 'I' format code
>
> Is there an easy way in Python to do the same conversion that C or C++
> code does? Thanks for any advice.

>>> 0xffffffff & -327681234

3967286062

Peter Otten, Feb 17, 2012

> >>> 0xffffffff & -327681234

>
> 3967286062

Very nice! Thanks for that example. Unsigned long longs:

0xffffffffffffffff & -9151314442815602945
9295429630893948671L

6. ### Dave AngelGuest

On 02/17/2012 02:22 PM, Brad Tilley wrote:
>>>>> 0xffffffff& -327681234

>> 3967286062

> Very nice! Thanks for that example. Unsigned long longs:
>
> 0xffffffffffffffff& -9151314442815602945
> 9295429630893948671L

Or more generally, use modulo

-13452324 % 2^64

--

DaveA

Dave Angel, Feb 17, 2012