Velocity Reviews > unsigned integer?

# unsigned integer?

hg
Guest
Posts: n/a

 03-10-2007
Dan Bishop wrote:

> On Mar 10, 11:32 am, "Jack" <(E-Mail Removed)> wrote:
>> 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

or abs(-1) ?

Jack
Guest
Posts: n/a

 03-10-2007
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?

Dan Bishop
Guest
Posts: n/a

 03-10-2007
On Mar 10, 11:32 am, "Jack" <(E-Mail Removed)> wrote:
> 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

Duncan Booth
Guest
Posts: n/a

 03-10-2007
"Jack" <(E-Mail Removed)> wrote:

> 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.

Dan Bishop
Guest
Posts: n/a

 03-10-2007
On Mar 10, 11:50 am, Duncan Booth <(E-Mail Removed)>
wrote:
> "Jack" <(E-Mail Removed)> wrote:
> > 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.

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

Duncan Booth
Guest
Posts: n/a

 03-10-2007
"Dan Bishop" <(E-Mail Removed)> wrote:

> On Mar 10, 11:50 am, Duncan Booth <(E-Mail Removed)>
> wrote:
>> "Jack" <(E-Mail Removed)> wrote:
>> > 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.

>
> %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.

Jack
Guest
Posts: n/a

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

"Jack" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> 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?
>

Paul Rubin
Guest
Posts: n/a

 03-10-2007
"Jack" <(E-Mail Removed)> writes:
> 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().

Gabriel Genellina
Guest
Posts: n/a

 03-10-2007
En Sat, 10 Mar 2007 16:26:08 -0300, Paul Rubin
<"http://phr.cx"@NOSPAM.invalid> escribió:

> "Jack" <(E-Mail Removed)> writes:
>> 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().

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.

--
Gabriel Genellina

Paul Rubin
Guest
Posts: n/a

 03-10-2007
"Gabriel Genellina" <(E-Mail Removed)> writes:
> 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.