programing

printf를 사용하여 64비트 정수를 교차 플랫폼으로 인쇄

i4 2023. 8. 29. 20:09
반응형

printf를 사용하여 64비트 정수를 교차 플랫폼으로 인쇄

Windows에서는 "%I64d"입니다.Linux 및 Solaris에서는 "%lld"입니다.
크로스 플랫폼을 작성하려는 경우printfs그것은 인쇄물long long가치: 그렇게 하는 좋은 방법은 무엇입니까?

long long ll;
printf(???, ll);

몇 가지 접근법이 있습니다.

당신은 코드를 C99에 맞는 방식으로 작성한 다음 컴파일러 작성자가 당신을 실망시킬 때 시스템별 해킹을 제공할 수 있습니다. (안타깝게도, 그것은 C99에서 다소 일반적입니다.)

#include <stdint.h>
#include <inttypes.h>

printf("My value is %10" PRId64 "\n", some_64_bit_expression);

대상 시스템 중 하나가 구현을 게을리한 경우<inttypes.h>또는 일부 유형 기능이 선택 사항이기 때문에 다른 방식으로 악의적으로 슬랙아웃되었습니다. 그러면 시스템별로 필요합니다.#define위해서PRId64(혹은 무엇이든) 그 시스템에서.

다른 접근 방식은 현재 항상 64비트로 구현되고 printf에서 지원되는 것을 선택한 다음 캐스트하는 것입니다.완벽하지는 않지만 종종 다음과 같은 이점이 있습니다.

printf("My value is %10lld\n", (long long)some_64_bit_expression);

MSVC 지원long long그리고.llVisual Studio 2005를 시작합니다.

매크로의 값을 확인할 수 있습니다.>= 1400또는 이전 컴파일러를 지원하지 않습니다.

C99 매크로를 제공하지 않으므로 다음으로 캐스트해야 합니다.long long사용하는 것보다PRId64.

MSVC가 아닌 컴파일러와 함께 이전 MSVC 라이브러리를 사용하는 경우에는 도움이 되지 않습니다(적어도 mingw는 지원하는 자체 버전의 printf를 제공한다고 생각합니다).ll)

아니요, Linux 및 Solaris에서는 부수적으로 다음과 같습니다.lld64비트 유형의 경우.C99는 이러한 것들을 휴대할 수 있도록 간단한 (그러나 추한) 매크로를 처방합니다.PRId64일부 윈도우 컴파일러는 표준을 따르지 않기 때문에 운이 없을 수도 있습니다.

편집: 예제에서 64비트 정수와 다른 것을 사용하고 있습니다.long long일부 아키텍처에서는 128일 수 있습니다.여기서 C99는typedef형식의 최소 또는 정확한 너비를 보장합니다(플랫폼에 구현된 경우).이러한 유형은 에서 찾을 수 있습니다.inttypes.h헤더, 즉int64_t2의 보어로 표시되는 고정 너비 64비트 유형의 경우.윈도우 컴파일러에 이것이 있을 수도 있고 없을 수도 있습니다.

또는 다음과 같은 코드를 사용할 수 있습니다.

uint64_t currentTimeMs = ...;

printf("currentTimeMs = 0x%08x%08x\n",
            (uint32_t)(currentTimeMs >> 32),
            (uint32_t)(currentTimeMs & 0xFFFFFFFF)
    );

또는 다음과 같습니다.

printf("currentTimeMs = %u%09u\n",
            (uint32_t)(currentTimeMs / 1000000000),
            (uint32_t)(currentTimeMs % 1000000000)
    );

언급URL : https://stackoverflow.com/questions/6299083/cross-platform-printing-of-64-bit-integers-with-printf

반응형