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/