我只花了一个时间来确定我的大整数是好的,并且
printf
%d /%u不能胜任显示它的任务:
use strict; use warnings; use bigint; use List::Gen; *factorial = do {use bigint; <[..*] 1,1..>->code}; my $value = factorial(32); printf "%d\n",$value; # -1 printf "%u\n",$value; # 18446744073709551615 printf "%s\n",$value; # 263130836933693530167218012160000000
如果答案是否定的话,我不会感到惊讶,只是想确认一下.
解决方法
这令人惊讶地难以追查.我在文档中没有看到任何明显的东西,所以我去了源头. print函数由C函数Perl_sv_vcatpvfn_flags实现(在长调用栈的底部).看起来好像这个函数假设数字适合IV或UV.它们的定义是
typedef IVTYPE IV; typedef UVTYPE UV;
反过来又定义了(至少在我的Perl上,我认为这是可配置的)
#define IVTYPE long /**/ #define UVTYPE unsigned long /**/
因此,如果您的数字不适合长,然后(%d)或无符号长(%u),那么字符串(%s)是您唯一的选择.一个更大的问题是你首先使用printf的原因.您是否以某种方式格式化这些数字而不是打印它们?如果没有,那么印刷应该做正确的事情.