IT박스

uint32_t 및 size_t에 대한 printf 형식 지정자

itboxs 2020. 9. 1. 07:19
반응형

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

조언에 감사드립니다.


실제로 (32 비트) 인 경우 ( 64 비트) size_t와 동일 할 것으로 예상 하는 것처럼 들립니다 . 두 경우 모두 사용해보십시오 .unsigned longunsigned int%zu

그래도 확실하지는 않습니다.


시험

#include <inttypes.h>
...

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

z동일 길이의 정수를 나타내고 size_t, 상기 PRIu32매크로 C99 헤더의 정의를inttypes.h , 부호없는 32 비트 정수를 나타낸다.


필요한 것은 형식 지정자와 유형이 일치하기 만하면되며 항상이를 사실로 만들기 위해 캐스팅 할 수 있습니다. long32 비트 이상이므로 %luwith (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

반응형