3

我对 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 的负数?

4

1 回答 1

5

Perl 数字表示为 anIV或 a UVSV它是结构本身的标志。

我猜当一个数字变成有符号时,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是什么。

于 2013-10-15T04:27:13.433 回答