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
그리고.ll
Visual Studio 2005를 시작합니다.
매크로의 값을 확인할 수 있습니다.>= 1400
또는 이전 컴파일러를 지원하지 않습니다.
C99 매크로를 제공하지 않으므로 다음으로 캐스트해야 합니다.long long
사용하는 것보다PRId64
.
MSVC가 아닌 컴파일러와 함께 이전 MSVC 라이브러리를 사용하는 경우에는 도움이 되지 않습니다(적어도 mingw는 지원하는 자체 버전의 printf를 제공한다고 생각합니다).ll
)
아니요, Linux 및 Solaris에서는 부수적으로 다음과 같습니다.lld
64비트 유형의 경우.C99는 이러한 것들을 휴대할 수 있도록 간단한 (그러나 추한) 매크로를 처방합니다.PRId64
일부 윈도우 컴파일러는 표준을 따르지 않기 때문에 운이 없을 수도 있습니다.
편집: 예제에서 64비트 정수와 다른 것을 사용하고 있습니다.long long
일부 아키텍처에서는 128일 수 있습니다.여기서 C99는typedef
형식의 최소 또는 정확한 너비를 보장합니다(플랫폼에 구현된 경우).이러한 유형은 에서 찾을 수 있습니다.inttypes.h
헤더, 즉int64_t
2의 보어로 표시되는 고정 너비 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
'programing' 카테고리의 다른 글
ASP에서 DbContext를 확인할 수 없습니다.NET Core 2.0 (0) | 2023.08.29 |
---|---|
IIS AppPool 작업자 프로세스 ID를 가져오는 방법 (0) | 2023.08.29 |
mysql - IF 문 내에서 코드 블록을 실행하는 방법(프로시저에서는 실행하지 않음) (0) | 2023.08.29 |
요소가 부모의 자식인지 확인 (0) | 2023.08.29 |
intptr_t 및 uninttr_t의 문자열 형식 (0) | 2023.08.29 |