perl - 如何检查 64 位整数的可用性(对于 `use integer` )?

标签 perl 64-bit

我想编写一个需要 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/

相关文章:

multithreading - 在独立 Perl 脚本中使用 Mojo::Promise

c - 64 位函数返回 32 位指针

windows - 为什么 x64 项目使用默认的打包对齐方式 16?

64-bit - 处理器,操作系统:32bit,64 bit

Eclipse 以 64 位运行应用程序。 JAR 以 32 位运行

perl - 如果 -expires 设置为 -1,CGI::Cookie 会存活多久?

regex - 我如何在 perl 中像这样 (.+) 为指定的字符串使用正则表达式?

javascript - 具有 href 和 onclick 以及 AJAX 请求的 HTML 标记 <a>

64-bit - 安装 python-igraph 0.7.1-4 会引发错误 "10038, ' 尝试对非套接字的内容进行操作'

multithreading - 在Perl中使用多线程时,应如何更新哈希哈希?