Perl Monk, Perl Meditation PerlMonks

by sn1987a (Deacon)
 on Feb 11, 2014 at 14:58 UTC Need Help??

I notice that Net/CIDR/Lookup.pm has "use integer"

According to Shift Operators:

Note that both << and >> in Perl are implemented directly using << and >> in C. If use integer (see Integer Arithmetic) is in force then signed C integers are used."
This means that right shifts will be sign extended. Anything with the msb set will be sign extended and remain negative.

```\$ perl -E 'use integer; say 0x80000000 >> 31'
-1

RichardK's suggestion above would avoid this issue.

Replies are listed 'Best First'.
by Athanasius (Archbishop) on Feb 11, 2014 at 15:51 UTC

++sn1987a (when the Vote Fairy next visits) for an ingenious observation! Unfortunately, I don’t think it answers the OP’s question, as masking with bitwise-AND does remove the sign bit, even with use integer in effect:

```#! perl
use strict;
use warnings;

print "\nno integer\n";

my \$bit = -1 >> 31;
printf "unmasked: 0x%x = %d\n", \$bit, \$bit;

\$bit = (-1 & 0x80000000) >> 31;
printf "masked:   0x%x = %d\n", \$bit, \$bit;

use integer;

print "\nuse integer\n";

\$bit = -1 >> 31;
printf "unmasked: 0x%x = %d\n", \$bit, \$bit;

\$bit = (-1 & 0x80000000) >> 31;
printf "masked:   0x%x = %d\n", \$bit, \$bit;

Output:

``` 1:29 >perl 868_SoPW.pl

no integer

use integer

1:29 >perl -v

This is perl 5, version 18, subversion 2 (v5.18.2) built for MSWin32-x

:-(

Update: As BrowserUk observes below, masking removes the sign bit (in this case) only in perls built with 64-bit ints. For perls built with 32-bit ints, sn1987a’s observation does answer the OP’s question. (Moral for self: test, test, test!)

 Athanasius <°(((>< contra mundum Iustus alius egestas vitae, eros Piratica,

The problem only(*) occurs with 32-bit perls:

```C:\test>type CIDRtest.pl
#! perl -slw
use strict;
use integer;

for my \$n ( 0 .. 31 ) {
my \$addr = (1 << \$n) + 1;
my \$nbits = 32;
while( 1 ) {
my \$bit = ( \$addr & 0x80000000 ) >> 31;
die "\$addr -> \$bit" if \$bit != 0 and \$bit != 1;
last unless --\$nbits;
}
}

C:\test>CIDRtest.pl
2147483649

C:\test>\perl32\bin\perl.exe CIDRtest.pl
-2147483648 -> -1 at CIDRtest.pl line 11.
2

(*Or 64-bit perls, but with much higher numbers.)

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
The problem only(*) occurs with 32-bit perls:

Aaargh ... and hadn't even noticed that my laptop's system perl has 64 bit ints even though it's i686 so I'd used it for testingwhat I thought was a 32 bit system m(

Many thanks everybody, that was the whack I needed!

Thanks for the update Athanasius. I was not aware of that feature. :)

Oh well, back to the drawing board...

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1074428]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (2)
As of 2024-07-24 22:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?

No recent polls found

Notices?
 • erzuuli ‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.