我编写了一些测试程序打印的值~0
and 2**64
:
#!/usr/bin/perl
use warnings;
use strict;
#use integer;
print ~0, "\n";
print 2**64, "\n";
Without use integer
程序输出
118446744073709551615
1.184467440737096e+19
With use integer
程序输出:
-1
1.184467440737096e+19
另一个奇怪的事情是,即使使用print int(2**64)
该数字仍然以科学格式输出,就像int(...)
不在那里(仍然~0
没有use integer
以“整数格式”输出)。
我可以使用强制整数输出printf("%u\n", ...)
, 然而。
(Perl 在 x86_64 上的 SLES12 SP5 5.18.2 中使用)
问题:
那么为什么是2**64
有和没有的“浮动”use integer
, while ~0
从来没有?
与use integer
when ~0
打印为-1
,仍然满足条件~0 > 2**63
(当我期望-1
not大于任何正值(例如2**63
).
Update
Perl 调试器中似乎还出现了另一个奇怪的效果:2^64
是奇数,并且2^64-1
is -2
.
DB<22> if (1) { use integer; print 2**64, "\n" }
1.84467440737096e+19
DB<23> if (1) { use integer; print 2**64 - 1, "\n" }
-2
DB<13> if (1) { use integer; printf '%x', 2**64-1, "\n" }
fffffffffffffffe
DB<14> if (1) { use integer; printf '%x', 2**64, "\n" }
ffffffffffffffff
DB<15> if (1) { no integer; printf '%x', 2**64, "\n" }
ffffffffffffffff
DB<16> if (1) { no integer; printf '%x', 2**63, "\n" }
8000000000000000