我对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?
答案 0 :(得分:5)
Perl号码表示为IV
或UV
。它是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
可以使用SvIOK
和SvUOK
标记来查看SV
的实际有效字段。