Re: unexpected results using sprintf() with %u

From: Date: Fri, 03 Oct 2003 07:14:25 +0000
Subject: Re: unexpected results using sprintf() with %u
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-164867@lists.php.net to get a copy of this message
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.

« previous php.general (#164867) next »