我想编写一个需要 40 位整数的程序。 我正在编写它的机器有 64 位整数,但我想在程序内部检查是否有 64 位整数可用。
我怎样才能有效地做到这一点?
在 64 位机器上,这似乎可行:
~0 >= 2**63
在不同的架构上是否安全(读作:“便携”)?
考虑到这个问题,我还想知道 Perl 编译器或解释器是否会使这些结果对 future 的 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 ''
最佳答案
如果您需要计算机意义上的整数 (IV/UV),则需要它们的大小至少为 40 位。
~0 >= 2**40-1
或
use Config qw( %Config );
$Config{uvsize} >= 8
uvsize
指的是此类整数的字节大小。
如果您使用以下任何一项,则需要此信息:
- 将数字作为按位运算符的操作数
- 作为操作数的数字
..
/...
打包“Q”
/解压“Q”
- 大于 0xFFFF_FFFF 的十六进制文字
如果您需要数学意义上的整数,精度至少为 40 位的 float (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 位)
。
关于perl - 如何检查 64 位整数的可用性(对于 `use integer` )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68890205/