[c] printf를 사용하여 부호없는 long long int를 어떻게 포맷합니까?

#include <stdio.h>
int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

산출:

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

이 예기치 않은 결과는를 인쇄 한 것으로 가정합니다 unsigned long long int. 당신이 어떻게 할 printf()에게 unsigned long long int?



답변

u (부호없는) 변환과 함께 ll (el-el) long long 수정자를 사용하십시오. (Windows, GNU에서 작동).

printf("%llu", 285212672);


답변

당신은 당신과 같은 유형을 제공하는 inttypes.h 라이브러리를 사용하여 시도 할 수 있습니다
int32_t, int64_t, uint64_t등 당신은 다음과 같은 자사의 매크로를 사용할 수 있습니다 :

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

이것은 당신에게 같은 문제가주지하는 “보장”되어 long, unsigned long long각 데이터 유형에 얼마나 많은 비트 생각하지 않기 때문에, 등.


답변

%d-> int

%u-> unsigned int

%ld-> long int또는long

%lu->에 대한 unsigned long int또는 long unsigned int또는unsigned long

%lld-> long long int또는long long

%llu-> unsigned long long int또는unsigned long long


답변

MSVS를 사용하는 long long (또는 __int64)의 경우 % I64d를 사용해야합니다.

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i


답변

Windows에서 % llu가 제대로 작동하지 않고 % d가 64 비트 정수를 처리 할 수 ​​없기 때문입니다. 대신 PRIu64를 사용하는 것이 좋으며 Linux에서도 이식 가능하다는 것을 알 수 있습니다.

대신 이것을 시도하십시오 :

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %" PRIu64 ". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

산출

My number is 8 bytes wide and its value is 285212672. A normal number is 5.


답변

리눅스에서는 %lluWindows에서는%I64u

Windows 2000에서는 작동하지 않지만 버그가있는 것 같습니다!


답변

VS2005를 사용하여 x64로 컴파일하십시오.

% llu는 잘 작동합니다.