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
, 및PRIu32
C99 헤더에 정의되어 있는 매크로는 부호 없는 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
더 까다롭기 때문에%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
'programing' 카테고리의 다른 글
계산된 속성 및 Vuex (0) | 2022.07.31 |
---|---|
이미지를 vuex에 저장할 수 있습니까?한번 해볼까? (0) | 2022.07.31 |
Vue.js, Vuex, Vuex 저장소의 데이터가 변환될 때 컴포넌트 뷰가 반응하지 않음(알 수 없는 예외 포함) (0) | 2022.07.31 |
안타깝게도 My App이 중지되었습니다.어떻게 하면 해결할 수 있을까요? (0) | 2022.07.31 |
자바에서는 나이를 어떻게 계산하나요? (0) | 2022.07.31 |