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 の数値は、IVまたは のいずれかで表されます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 に答える