在引擎盖下perl 64位整数

时间:2013-10-15 04:24:12

标签: perl integer 64-bit

我对perl中64位整数的内部表示感到困惑。

Ubuntu 12.04,perl 5.16.0:

print 18440000000000001000 . "\n";
print 18450000000000001000 . "\n";
print -9220000000000001000 . "\n";
print -9230000000000001000 . "\n";

输出:

18440000000000001000
1.845e+19
-9220000000000001000
-9.23e+18

显然正数会溢出并被强制浮动,相应的精度损失,为2 ^ 64。但是 - 没有为符号位留下空间,那么负数如何表示为-2 ^ 63?

1 个答案:

答案 0 :(得分:5)

Perl号码表示为IVUV。它是SV结构本身的标志。

我猜测一个号码签名后,UV变为IV,反之亦然。

具体来说,查看SV定义:

#define _SV_HEAD_UNION \
union {                             \
    char*   svu_pv;         /* pointer to malloced string */        \
    IV      svu_iv;                 \
    UV      svu_uv;                 \
    SV*     svu_rv;         /* pointer to another SV */             \
    SV**    svu_array;              \
    HE**    svu_hash;               \
    GP*     svu_gp;                 \
    PerlIO *svu_fp;                 \
}   sv_u

可以使用SvIOKSvUOK标记来查看SV的实际有效字段。