2013-10-15 70 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