On Tue, Sep 16, 2008 at 7:07 PM, John W. Krahn <[EMAIL PROTECTED]> wrote:
> Amit Saxena wrote: > >> On Tue, Sep 16, 2008 at 5:04 PM, John W. Krahn <[EMAIL PROTECTED]> wrote: >> >>> >>> Amit Saxena wrote: >>> >>>> >>>> In the following code, the value of "$string" in last two cases is not >>>> printed correctly. >>>> >>>> Please let me know what i am missing over here. >>>> >>>> *# cat l3.pl* >>>> #! /usr/bin/perl >>>> >>>> >>>> $ONE_BYTE_RANGE = 256; >>>> >>> >>> A one byte range is 0 to 255 so 256 is 1 bit more than one byte. >>> >>> $TWO_BYTE_RANGE = 65536; >>>> >>> Same here, you are one bit over the two byte range. >>> >>> $THREE_BYTE_RANGE = 4294967296; >>>> $THREE_BYTE_RANGE_1 = 4294967295; >>>> >>> >>> A three byte range is 0 to 16777215. What you have there is a _four_ >>> byte >>> range plus one. >>> >>> If you have a 32 bit computer then the largest integer that perl can use >>> is >>> 4294967295. >>> >>> $string = sprintf( "%d, %d ", hex( "9A" ), $ONE_BYTE_RANGE ); >>>> print (" String = $string \n "); >>>> $string = sprintf( "%d", hex( "9A" ) - $ONE_BYTE_RANGE ); >>>> print (" String = $string \n "); >>>> $string = sprintf( "%d , %d", hex( "BB76" ), $TWO_BYTE_RANGE ); >>>> print (" String = $string \n "); >>>> $string = sprintf( "%d", hex( "BB76" ) - $TWO_BYTE_RANGE ); >>>> print (" String = $string \n "); >>>> $string = sprintf( "%ld , %ld ", hex("98EAB"), $THREE_BYTE_RANGE ); >>>> print (" String = $string \n "); >>>> $string = sprintf( "%ld", hex("98EAB") - $THREE_BYTE_RANGE ) ; >>>> print (" String = $string \n "); >>>> $string = sprintf( "%ld", (hex("98EAB") - $THREE_BYTE_RANGE_1 - 1) ) ; >>>> print (" String = $string \n "); >>>> >>>> *# perl l3.pl* >>>> String = 154, 256 >>>> String = -102 >>>> String = 47990 , 65536 >>>> String = -17546 >>>> String = 626347 , -1 >>>> String = -2147483648 >>>> String = -2147483648 >>>> >>> >>> What numbers did you expect would be printed? >>> >> >> What my doubt is why the output of following two statements is same :- >> >> $string = sprintf( "%ld", hex("98EAB") - $THREE_BYTE_RANGE ) ; >> print (" String = $string \n "); >> $string = sprintf( "%ld", (hex("98EAB") - $THREE_BYTE_RANGE_1 - 1) ) ; >> print (" String = $string \n "); >> > > Because the expression "hex("98EAB") - $THREE_BYTE_RANGE_1 - 1" is > evaluated as "( hex("98EAB") - $THREE_BYTE_RANGE_1 ) - 1" and not as > "hex("98EAB") - ( $THREE_BYTE_RANGE_1 - 1 )" as you probably intended, so it > appears that subtracting 1 from a number that has overflowed/underflowed is > not affecting the total. (This may be a bug in Perl, I don't know.) > > $ perl -le' > $THREE_BYTE_RANGE = 4_294_967_296; > $THREE_BYTE_RANGE_1 = 4_294_967_295; > print join " ", hex( "98EAB" ), $THREE_BYTE_RANGE, hex( "98EAB" ) - > $THREE_BYTE_RANGE; > print join " ", hex( "98EAB" ), $THREE_BYTE_RANGE_1 - 1, ( hex( "98EAB" ) > - $THREE_BYTE_RANGE_1 ) - 1; > print join " ", hex( "98EAB" ), $THREE_BYTE_RANGE_1 - 1, hex( "98EAB" ) - > ( $THREE_BYTE_RANGE_1 - 1 ); > ' > 626347 4294967296 -4294340949 > 626347 4294967294 -4294340949 > 626347 4294967294 -4294340947 > > > That also raises another question, does the perl also has a concept of >> signed integer representation like "C". >> > > The pack()/unpack()/printf()/sprintf() formats are based on C data types > and have signed and unsigned representations. > > > > > John > -- > Perl isn't a toolbox, but a small machine shop where you > can special-order certain sorts of tools at low cost and > in short order. -- Larry Wall > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > http://learn.perl.org/ > > > Are you working on 64 bit system ? Regards, Amit Saxena