uint_64_t를 va_list로 잘못 전달
Jan 05 2021
사용자 지정 printf
함수를 작성 uint64_t
중이며 다음으로 잘못 전달 된 것 같습니다 va_list
.
문제점 :
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
printf
잘못된 결과를 생성하는 구현의 일부 :
format++;
uint64_t num = va_arg(parameters, uint64_t);
gdb로 디버깅 할 때의 값은 내가 기대하는 것보다 num
되고 다음 값 은 0이됩니다. 이것은 내가 놓치고있는 일부 표준 동작입니까, 아니면 내가 뭔가 잘못하고 있습니까?0xffffffffff00ffb7
0xff00ffb7
%C
num
답변
4 chux-ReinstateMonica Jan 05 2021 at 02:39
0xff00ffb7
가 uint64_t
가변 함수를 의미하는 경우 캐스트하십시오.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
, 정수 상수 인, 유형은 int, unsigned, long, unsigned long, long long
또는, unsigned long long
: "적합"한 첫 번째 유형입니다 . 32 비트와 함께 int/unsigned
, 0xff00ffb7
것 unsigned
, 영업 이익의 문제의 가능성이 소스.
u
상수에 추가 하는 것은 그것이 어떤 서명되지 않은 유형인지 확인 하는 좋은 생각입니다.
L
또는 LL
상수에 추가 하는 것은 상수가임을 보장하는 좋은 생각이 아닙니다 uint64_t
. 둘 다 일치 할 수LL
있지만 ( 종종 일치 ) 이러한 접미사는 해당 유형을 보장하지 않습니다.
사용 UINT64_C(0xff00ffb7)
형태를 유형의 상수 uint_least64_t
로 확실히 동일 uint64_t
이 기계에를 uint64_t
.