Perl und grosse Zahlen
Bit-Operationen nur 32bit
Die Bit-Operationen sind bei Perl systemabhängig; bei einem gängigem 32bit-System werden nur die 32 Bits verarbeitet:
#!/usr/bin/perl
my $big = 1;
for (my $i=0; $i<=32; $i++) {
print $i, "\t", $big << $i, "\n";
}
Das Ergebnis:
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
11 2048
12 4096
13 8192
14 16384
15 32768
16 65536
17 131072
18 262144
19 524288
20 1048576
21 2097152
22 4194304
23 8388608
24 16777216
25 33554432
26 67108864
27 134217728
28 268435456
29 536870912
30 1073741824
31 2147483648
32 1
Integer overflow in hexadecimal number
Perl meckert bei hex-Konstanten ab 32bit:
my@desktop:~$ perl -w -e 'print 0xffffffff, "\n";'
4294967295
my@desktop:~$ perl -w -e 'print 0x100000000, "\n";'
Integer overflow in hexadecimal number at -e line 1.
Hexadecimal number > 0xffffffff non-portable at -e line 1.
4294967296
Perl rechnet aber trotzdem damit:
my@desktop:~$ perl -w -e 'print 0x100000000 + 1, "\n";'
Integer overflow in hexadecimal number at -e line 1.
Hexadecimal number > 0xffffffff non-portable at -e line 1.
4294967297
Perl rechnet mit bis zu 1024 Bits
Intern rechnet Perl mit bis zu 1024 Bits, wie man hier erkennt:
#!/usr/bin/perl -w
for (my $bit=1; $bit <= 1024; $bit++) {
print $bit, "\t", 2**$bit, "\n";
}
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
11 2048
12 4096
13 8192
14 16384
15 32768
16 65536
17 131072
18 262144
[...]
48 281474976710656
49 562949953421312
50 1.12589990684262e+15
51 2.25179981368525e+15
[...]
1021 2.24711641857789e+307
1022 4.49423283715579e+307
1023 8.98846567431158e+307
1024 inf
Zahlen etwas hübscher
Manchmal will man die wissenschaftlichen Zahl-Angabe in klartext haben. Das geht mit printf und "%.0f":
#!/usr/bin/perl -w
for (my $bit=48; $bit <= 51; $bit++) {
printf("%d\t%.0f\n", $bit, 2**$bit);
}
48 281474976710656
49 562949953421312
50 1125899906842624
51 2251799813685248