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
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.