긴 형식의 printf에 대한 논쟁은 무엇입니까?


답변:


633

l지정자 바로 앞에 (소문자 L)를 넣으십시오 .

unsigned long n;
long m;

printf("%lu %ld", n, m);

14
printf("%ld", ULONG_MAX)값을 -1로 출력합니다. 이어야한다 printf("%lu", ULONG_MAX)아래 @Blorgbeard에 의해 설명 된 바와 같이 긴 부호를 위해.
jammus

2
실제로 %ldOP 질문과 더 조화를 이루도록로 변경해야합니다 .
Dr Beco

네 Dr Beco; 또한, 단지 %l트리거warning: unknown conversion type character 0x20 in format [-Wformat]
파트 리 지오 베르 토니

190

나는 당신이 의미하는 것 같아요 :

unsigned long n;
printf("%lu", n);   // unsigned long

또는

long n;
printf("%ld", n);   // signed long

73

대부분의 플랫폼에서 longint동일한 크기 (32 비트)이다. 여전히 자체 형식 지정자가 있습니다.

long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned

64 비트의 경우 long long:

long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned

물론 Windows에서는 다릅니다.

printf("%l64d", n); // signed
printf("%l64u", un); // unsigned

64 비트 값을 인쇄 할 때 16 진수로 인쇄하는 것이 도움이되는 경우가 많습니다 (일반적으로 숫자가 큰 경우 포인터 또는 비트 필드 임).

unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"

인쇄합니다 :

0x00000000DEADBEEF

Btw, "long"은 더 이상 (주류 x64에서) 그렇게 많은 것을 의미하지 않습니다. "int"는 플랫폼 기본 int 크기이며 일반적으로 32 비트입니다. "긴"은 보통 같은 크기입니다. 그러나 이전 플랫폼 (및 최신 임베디드 플랫폼)에서 이식성이 다른 의미가 있습니다. "long long"은 64 비트 숫자이며 보통 x- 플랫폼 휴대용 코드를 편집하는 작업을 실제로 알지 않는 한 사람들이 일반적으로 사용하는 것입니다. 그럼에도 불구하고 아마도 유형의 의미 적 의미를 캡처하기 위해 매크로를 사용했을 것입니다 (예 : uint64_t).

char c;       // 8 bits
short s;      // 16 bits
int i;        // 32 bits (on modern platforms)
long l;       // 32 bits
long long ll; // 64 bits 

당시에는 "int"가 16 비트였습니다. 이제 64 비트가 될 것이라고 생각하지만, 이식성이 문제가 될 수 있습니다. 물론, 이것조차도 신비 롭고 역사가 풍부한 진실을 단순화 한 것입니다. wiki : 정수 참조


@MM 혼란을 피하기 위해 내 대답을 명확히했습니다.
Dave Dopson

4
간단히 말하면 : x86 및 x64보다 많은 아키텍처가 있으며 이러한 아키텍처에서 char, short, int, long 및 long long은 다른 의미를 갖습니다. 예를 들어, 16 비트 메모리 정렬을 가진 32 비트 MCU는 다음을 사용할 수 있습니다. char = short = int = 16 비트; 긴 = 32 비트; long long = 64 비트
AndresR

1
@AndresR-절대적으로 내장 프로그래밍을하는 사람들에게 매우 중요합니다 (연기 경보 용 커널 모듈을 한 번 만들었습니다). 가난한 사람들은 이식성을 위해 작성되지 않은 코드를 사용하려고 할 때 동정합니다.
Dave Dopson

"대부분의 플랫폼은 long32의 크기를 가지고 있습니다 "가 여전히 사실 인지 잘 모르겠습니다 . 예, 나는 오라클 리눅스 x86_64의 / AMD64에있어,와 함께 8 바이트입니다. nvcclong
ragerdl

"아, 물론 Windows에서는 다릅니다." 크로스 플랫폼 솔루션이 있습니까?
Aaron Franke

17

부호없는 long을 참조하는 경우 서식 문자는 "%lu"입니다. 부호있는 long을 참조하는 경우 서식 문자는 "%ld"입니다.



12

unsigned long long예전처럼 인쇄하려는 경우 다음을 사용하십시오.

unsigned long long n;
printf("%llu", n);

다른 모든 조합의 경우 printf manual 의 테이블을 사용하여 인쇄하려는 유형에 대해 행을 사용한 다음 열 레이블을 사용한다고 생각합니다 ( printf("%llu", n)위와 같이).


0

이 질문에 확실히 대답하려면 사용중인 컴파일러 이름과 버전과 컴파일하는 플랫폼 (CPU 유형, OS 등)을 알아야합니다.


귀하의 답변은 그 자체로 답변이 아니라 의견이어야합니다.
Jaime Hablutzel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.