2013-10-15 66 views
3

我对perl中64位整数的内部表示感到困惑。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?

回答

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的实际有效字段。

+7

对不熟悉perl内部构件的人稍作翻译:64位perl上的数字标量可以是带符号的*或*无符号的64位int,perl将在它们之间进行转换,做出正确的选择很多时候。这意味着您可以轻松处理-2^63和+ 2^64之间的数字,超出此范围的结果是“仅”,您将降级到浮点数。 – hobbs

+2

“64位perl”在64位系统上包含大多数perls,而在32位系统上使用“ivsize = 8”而不是“ivsize = 4”。在这些perls中,'IV's是有符号的32位,'UV'是无符号的32位,但是双精度浮点为'NV'提供了+/- 2^53的整数精度。 – hobbs