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

前端之家收集整理的这篇文章主要介绍了perl – %s是唯一允许printf正确显示大整数的格式吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我只花了一个时间来确定我的大整数是好的,并且 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的原因.您是否以某种方式格式化这些数字而不是打印它们?如果没有,那么印刷应该做正确的事情.

猜你在找的Perl相关文章