On Fri, 3 Oct 2003 15:51:59 +1000, you wrote: >Im trying to retrieve the unsigned value of an integer. sounds pretty simple... > >[code] >$i = -86; >echo "<br>" . sprintf("%d", $i); >echo "<br>" . sprintf("%u", $i); >[/code] > >produces: >-86 >4294967198 > >what i expected: >-86 >86 > >Ive searched the archives but most of the messages refer to %s or %d... nothing in >regards to %u > >can anyone see what im doing wrong?
Uh... first, that's correct behaviour for %u Second, you're trying to find the absolute value of an integer: echo (abs(-86)); Third, how to explain the behaviour you're seeing. Um... Binary numbers are made up of two symbols, right? 0 and 1. There's no room in a binary computer for a third '-' symbol to denote negative numbers, so you have to overload one of your existing symbols to signify "negative". Ok, lets work with 8-bit numbers to simplify things. An unsigned 8 bit number can run from 0 to 255: 00000000 = 0 00000001 = 1 [...] 11111110 = 254 11111111 = 255 By convention, a signed 8-bit number sacrifices it's left-most column to denote negative (1) or positive (0), so it can run from -127 to +127: 11111111 = -127 11111110 = -126 [...] 10000001 = -1 00000000 = 0 00000001 = 1 [...] 01111110 = 126 01111111 = 127 Hope you're with me so far - signed numbers use the left-most column to store the sign of the number. If the left-most column is 1, the number is negative. What you are doing with %u is forcing printf() to treat a signed number with a leading 1 as if it was an unsigned number. Thus, an unsigned int 10000001 = -1 would be interpreted as 10000001 = 129 This stuff is very basic Computer Science. -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php