programing

uint32_t 및 size_t의 printf 형식 지정자

newsource 2022. 7. 31. 23:05

uint32_t 및 size_t의 printf 형식 지정자

다음과 같은 것이 있습니다.

size_t   i = 0;
uint32_t k = 0;

printf("i [ %lu ] k [ %u ]\n", i, k);

컴파일 시 다음과 같은 경고가 표시됩니다.

format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’

부목을 사용하여 실행한 결과 다음과 같은 결과가 나왔습니다.

Format argument 1 to printf (%u) expects unsigned int gets size_t: k

조언해 주셔서 감사합니다.

해라

#include <inttypes.h>
...

printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);

z와 같은 길이의 정수를 나타냅니다.size_t, 및PRIu32C99 헤더에 정의되어 있는 매크로는 부호 없는 32비트 정수를 나타냅니다.

기대하시는 것 같네요size_t같다unsigned long(64비트)는, 실제의 경우,unsigned int(32비트).사용해보십시오.%zu두 경우 모두.

하지만 나는 완전히 확신하지는 못한다.

필요한 것은 형식 지정자와 유형이 일치해야 하며, 언제든지 이를 실현하기 위해 캐스팅할 수 있습니다. long최소 32비트이기 때문에%lu와 함께(unsigned long)k는 항상 옳습니다.

uint32_t k;
printf("%lu\n", (unsigned long)k);

size_t더 까다롭기 때문에%zuC99에 추가되었습니다.못쓰겠다면 똑같이 취급하세요.k(longC89에서 가장 큰 타입입니다.size_t더 클 가능성은 거의 없습니다).

size_t sz;
printf("%zu\n", sz);  /* C99 version */
printf("%lu\n", (unsigned long)sz);  /* common C89 version */

전달하고 있는 타입의 포맷 지정자가 올바르지 않은 경우는,printf는, 어레이로부터 메모리를 너무 많이 읽거나 너무 적게 읽거나 하는 것과 같은 동작을 합니다.명시적 캐스트를 사용하여 유형을 맞추면 휴대할 수 있습니다.

PRI* 매크로를 사용하지 않는 경우는, 임의의 정수 타입을 인쇄하기 위한 또 다른 어프로치는, 다음과 같습니다.intmax_t또는uintmax_t및 사용"%jd"또는%ju,각각 다음과 같다.이것은, 예를 들면, PRI* 매크로가 정의되어 있지 않은 POSIX(또는 그 외의 OS) 타입에 특히 도움이 됩니다.off_t.

언급URL : https://stackoverflow.com/questions/3168275/printf-format-specifiers-for-uint32-t-and-size-t