Paso incorrecto de uint_64_t a va_list

Jan 05 2021

Estoy escribiendo una printffunción personalizada y uint64_tparece que se pasa incorrectamente a va_list:

Punto problemático:

printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);

Parte de mi printfimplementación que produce el resultado incorrecto:

format++;
uint64_t num = va_arg(parameters, uint64_t);

Al depurar con gdb, el valor de se numconvierte 0xffffffffff00ffb7en en lugar de 0xff00ffb7lo que esperaba, y para el siguiente se %C numconvierte en 0. ¿Es este un comportamiento estándar que me falta o estoy haciendo algo mal?

Respuestas

4 chux-ReinstateMonica Jan 05 2021 at 02:39

Si 0xff00ffb7está destinado a ser un uint64_tpara una función variada, conviértalo.

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

0xff00ffb7, como una constante entera, tiene el tipo de int, unsigned, long, unsigned long, long longo unsigned long long,: el primero que "encaja". Con 32 bits int/unsigned, 0xff00ffb7sería unsignedy probablemente la fuente de problemas de OP.

Agregar uuna constante es una buena idea para asegurarse de que sea de algún tipo sin firmar.

Agregar Lo LLa una constante no es una buena idea para asegurar que una constante sea uint64_t. Cualquiera puede coincidir (a LLmenudo lo hará), pero estos sufijos no garantizan ese tipo.

El uso de UINT64_C(0xff00ffb7)forma una constante de tipo uint_least64_tque ciertamente es la misma que uint64_ten las máquinas que tienen uint64_t.