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이됩니다. 이것은 내가 놓치고있는 일부 표준 동작입니까, 아니면 내가 뭔가 잘못하고 있습니까?0xffffffffff00ffb70xff00ffb7%C num

답변

4 chux-ReinstateMonica Jan 05 2021 at 02:39

0xff00ffb7uint64_t가변 함수를 의미하는 경우 캐스트하십시오.

printf("Number is %C", (uint64_t) 0xff00ffb7);

0xff00ffb7, 정수 상수 인, 유형은 int, unsigned, long, unsigned long, long long또는, unsigned long long: "적합"한 첫 번째 유형입니다 . 32 비트와 함께 int/unsigned, 0xff00ffb7unsigned, 영업 이익의 문제의 가능성이 소스.

u상수에 추가 하는 것은 그것이 어떤 서명되지 않은 유형인지 확인 하는 좋은 생각입니다.

L또는 LL상수에 추가 하는 것은 상수가임을 보장하는 좋은 생각이 아닙니다 uint64_t. 둘 다 일치 할 수LL 있지만 ( 종종 일치 ) 이러한 접미사는 해당 유형을 보장하지 않습니다.

사용 UINT64_C(0xff00ffb7)형태를 유형의 상수 uint_least64_t로 확실히 동일 uint64_t이 기계에를 uint64_t.