unsigned integer?

J

Jack

This is a naive question:

"%u" % -3

I expect it to print 3. But it still print -3.

Also, if I have an int, I can convert it to unsigned int in C:
int i = -3;
int ui = (unsigned int)i;

Is there a way to do this in Python?
 
D

Dan Bishop

This is a naive question:

"%u" % -3

I expect it to print 3. But it still print -3.

Also, if I have an int, I can convert it to unsigned int in C:
int i = -3;
int ui = (unsigned int)i;

Is there a way to do this in Python?

def unsigned(n):
return n & 0xFFFFFFFF
 
D

Duncan Booth

Jack said:
This is a naive question:

"%u" % -3

I expect it to print 3. But it still print -3.

Internally it uses the C runtime to format the number, but if the number
you ask it to print unsigned is negative it uses %d instead of %u. I have
no idea if it is actually possibly to get a different output for %d versus
%u.
Also, if I have an int, I can convert it to unsigned int in C:
int i = -3;
int ui = (unsigned int)i;

Is there a way to do this in Python?
Depeneding on how exactly you want it converted:

i = -3
ui = abs(i)
print ui
ui = (i & 0xffff) # for 16 bit integers
print ui
ui = (i & 0xffffffff) # for 32 bit integers
print ui
ui = (i & 0xffffffffffffffff) # for 64 bit integers
print ui
ui = (i & 0xffffffffffffffffffffffffffffffff) # for 128 bit integers
print ui

which gives the following output:

3
65533
4294967293
18446744073709551613
340282366920938463463374607431768211453

There isn't a unique way to convert a Python integer to an unsigned value
which is why the %u format string cannot do anything other than print the
value. Personally I'd have expected the Python one to either print the
absolute value or throw an exception, but I guess making it an alias for %d
kind of makes sense as well.
 
D

Dan Bishop

Internally it uses the C runtime to format the number, but if the number
you ask it to print unsigned is negative it uses %d instead of %u. I have
no idea if it is actually possibly to get a different output for %d versus
%u.

%u used to be different from %d, but it changed because of the int/
long unification in Python 2.4.
 
D

Duncan Booth

Dan Bishop said:
%u used to be different from %d, but it changed because of the int/
long unification in Python 2.4.
Yes, I guessed that was it.

The implementation is identical when the value is negative but still
different when the integer is non-negative which is why I questioned
whether it was actually possible to get different output. If not perhaps
both the implementation and the documentation should be simplified.
 
J

Jack

Thanks for all the replies. Because I want to convert an int,
Dan's function actually does it well.
 
P

Paul Rubin

Jack said:
Also, if I have an int, I can convert it to unsigned int in C:
int i = -3;
int ui = (unsigned int)i;

I just tried it:

main() {
int i = -3;
unsigned int ui = i;
printf("%d\n", ui);
}

prints -3. What do you want the conversion to do? If you want
the absolute value, use abs().
 
G

Gabriel Genellina

En Sat, 10 Mar 2007 16:26:08 -0300, Paul Rubin
I just tried it:

main() {
int i = -3;
unsigned int ui = i;
printf("%d\n", ui);
}

prints -3. What do you want the conversion to do? If you want
the absolute value, use abs().

Try again with "%u". Passing i or ui makes no difference, both push the
same value on the stack. C relies on the format string to interpret the
arguments.
 
P

Paul Rubin

Gabriel Genellina said:
Try again with "%u". Passing i or ui makes no difference, both push
the same value on the stack. C relies on the format string to
interpret the arguments.

If you use %u you get a very large positive value, not +3.
 
G

Gabriel Genellina

En Sat, 10 Mar 2007 20:26:13 -0300, Paul Rubin
If you use %u you get a very large positive value, not +3.

Exactly, and that's the right value. (unsigned int)(-3) isn't +3.
 
G

Gabriel Genellina

En Sat, 10 Mar 2007 21:04:00 -0300, Paul Rubin
The OP specified that the expected result was 3.

Ouch! Yes, sorry, I overlooked it. And the C code just made things more
confusing.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top