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/


Reply via email to