2016-10-08 4 views
3

난 그냥 내 큰 정수 좋은 것을 알아내는 획기적인 시간에 printf의 것을 %d/%u 그것을 표시하는 작업까지되지 않은 :% s는 printf가 큰 정수를 올바르게 표시 할 수있는 유일한 형식입니까?

이 가
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 
가 대답 나는 놀라지 않을 것입니다

경우 아니, 그냥 확인하고 싶었어.

답변

10

놀랍게도 추적하기가 어려웠습니다. 나는 문서에서 명백한 것을 보지 못했고 그래서 나는 출처로 갔다. printf 함수는 C 함수 Perl_sv_vcatpvfn_flags에 의해 (긴 호출 스택의 맨 아래에) 구현됩니다. 이 함수는 숫자가 IV 또는 UV에 맞다고 가정하는 것처럼 보입니다. 그들은 차례로에 의해 정의된다

typedef IVTYPE IV; 
typedef UVTYPE UV; 

에 의해 정의된다,

#define IVTYPE   long   /**/ 
#define UVTYPE   unsigned long   /**/ 

그래서, 전화 번호는 긴에 적합하지 않을 경우 (적어도 내 펄에,이 구성 할 생각) (%d) 또는 부호없는 long (%u)이면 문자열 (%s) 만 선택할 수 있습니다. 더 큰 문제는 처음에 printf을 사용하는 이유입니다. 인쇄 이외의 방법으로이 숫자의 서식을 지정하고 있습니까? 그렇지 않다면 print은 올바른 일을해야합니다.

+2

'printf'를 사용하는 특별한 이유는 내 프로세스 ginormous numbers를 먹이기 시작했을 때 이미 존재했다는 사실 외입니다. – Zaid

4

예. %s은 문자열의 유일한 형식입니다.


  • %% : 분명히 NO.
  • %c : 분명히 아니오.
  • %s : 예.
  • %d : 숫자가 부호있는 정수에 맞아야합니다.
  • %u, %o, %x, %X, %b, %B : 숫자는 부호없는 정수에 맞는 경우에만.
  • %e, %E, %f, %g, %G, %a, %A : 수는 부동 소수점 숫자에 맞는 경우에만.
  • %p : 분명히 아니오.
  • %n : 분명히 아니오.
4

당신은 숫자를 조작하기위한 목적으로 특정 라이브러리를 사용한다는 것을 감안할 때 내장printf 그들을 처리 할 것이라고 예상 할 이유가 없습니다. 대신 as_hex 또는 bnstr과 같이 라이브러리 conversion functions을 사용할 수 있습니다. 방금 번호를 인쇄하려면 print "$value\n";을 사용하십시오.

+4

bigint pragma는 핵심 Perl 5의 일부이므로 Perl 5가 올바르게 처리 할 수있는 이유를 (추가 문서없이) 볼 수 있습니다. –