%s是唯一允许printf正确显示大整数的格式吗?

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应该做正确的事情.

  • 没有特别的理由使用`printf`,而不是当我开始喂我的过程巨大的数字时已经存在的事实. (2认同)