如何检查 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 位
我想编写一个需要 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)
.