Zai*_*aid 3 perl printf biginteger
我只花了一个划时代搞清楚,我的大整数是个好人,是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
Run Code Online (Sandbox Code Playgroud)
如果答案是否定的话,我不会感到惊讶,只是想确认一下.
Cha*_*ens 10
这令人惊讶地难以追查.我在文档中没有看到任何明显的东西,所以我去了源头.该printf函数由C函数实现(在长调用栈的底部)Perl_sv_vcatpvfn_flags.看起来好像这个函数假设数字适合IV或UV.它们的定义是
typedef IVTYPE IV;
typedef UVTYPE UV;
Run Code Online (Sandbox Code Playgroud)
反过来又定义了(至少在我的Perl上,我认为这是可配置的)
#define IVTYPE long /**/
#define UVTYPE unsigned long /**/
Run Code Online (Sandbox Code Playgroud)
因此,如果您的数字不适合long,那么(%d)或无符号long(%u),那么string(%s)是您唯一的选择.一个更大的问题是你printf首先使用的原因.您是否以某种方式格式化这些数字而不是打印它们?如果没有,那么print应该做正确的事情.