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 long
unsigned int
%zu
그래도 확실하지는 않습니다.
시험
#include <inttypes.h>
...
printf("i [ %zu ] k [ %"PRIu32" ]\n", i, k);
는 z
동일 길이의 정수를 나타내고 size_t
, 상기 PRIu32
매크로 C99 헤더의 정의를inttypes.h
, 부호없는 32 비트 정수를 나타낸다.
필요한 것은 형식 지정자와 유형이 일치하기 만하면되며 항상이를 사실로 만들기 위해 캐스팅 할 수 있습니다. long
32 비트 이상이므로 %lu
with (unsigned long)k
는 항상 정확합니다.
uint32_t k;
printf("%lu\n", (unsigned long)k);
size_t
까다롭기 때문에 %zu
C99에 추가되었습니다. 그것을 사용할 수 없다면 k
( long
C89에서 가장 큰 유형이며 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
'IT박스' 카테고리의 다른 글
세션없이 Spring Security를 어떻게 사용할 수 있습니까? (0) | 2020.09.01 |
---|---|
String.Empty 대 "" (0) | 2020.09.01 |
고정 너비로 문자열을 인쇄하는 방법은 무엇입니까? (0) | 2020.08.31 |
JavaScript / JQuery에서 html 요소 객체를 복제 할 수 있습니까? (0) | 2020.08.31 |
프로젝트를 열 수 없습니다… 프로젝트 파일을 구문 분석 할 수 없기 때문에 열 수 없습니다. (0) | 2020.08.31 |