如何检查 64 位整数的可用性(用于“使用整数”)?

How to check availability of 64-bit integers (for `use integer`)?

我想编写一个需要 40 位整数的程序。 我正在编写它的机器有 64 位整数,但我想在程序内部检查是否有 64 位整数可用。

我怎样才能有效地做到这一点?

在 64 位机器上,这似乎可行:

~0 >= 2**63

在不同的架构上是否安全(读作:“便携”)?

考虑到这个问题,我还想知道 Perl 编译器或解释器是否会使这些结果对未来的 Perl 版本产生疑问:

  DB<2> sub bittest { use integer; return ((1 << $_[0]) >> $_[0]) != 0; }

  DB<3> x bittest 31
0  1
  DB<4> x bittest 63
0  1
  DB<5> x bittest 64
0  ''

~0在64位系统上是18446744073709551615,所以

~0 == 18446744073709551615
~0 == 0xFFFFFFFFFFFFFFFF       # (16 F's)

是查看您是否在 64 位系统上的有效测试。

我只在 32 位和 64 位系统上使用过 Perl,但如果有 39 位和 41 位系统,要使用 40 位整数,你只需要至少 ~0 2**40 - 1,或:

~0 >= 0xFFFFFFFFFF             # (10 F's)

如果您需要计算机意义上的整数 (IV/UV),则需要它们的大小至少为 40 位。

~0 >= 2**40-1

use Config qw( %Config );

$Config{uvsize} >= 8

uvsize指的是此类整数的字节大小。

如果您使用以下任何一项,则需要此文件:

  • 作为按位运算符的操作数的数字
  • 作为 ../...
  • 的操作数的数字
  • pack 'Q'/unpack 'Q'
  • 十六进制文字大于 0xFFFF_FFFF

如果您需要数学意义上的整数,精度至少为 40 位的浮点数 (NV) 也可以。

use Config qw( %Config );

$Config{uvsize} >= 8 || eval($Config{nv_overflows_integers_at}) >= 2**40

包括 eval($Config{nv_overflows_integers_at}) 在内的每个整数都可以精确表示为 NV。

请注意,每个 Perl 版本都应至少支持 53 位精度。 例如,eval($Config{nv_overflows_integers_at}) 在我的构建中评估为 9007199254740992,这对应于 log(9007199254740992)/log(2).

的 53 位