Paso incorrecto de uint_64_t a va_list
Estoy escribiendo una printf
función personalizada y uint64_t
parece 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 printf
implementación que produce el resultado incorrecto:
format++;
uint64_t num = va_arg(parameters, uint64_t);
Al depurar con gdb, el valor de se num
convierte 0xffffffffff00ffb7
en en lugar de 0xff00ffb7
lo que esperaba, y para el siguiente se %C
num
convierte en 0. ¿Es este un comportamiento estándar que me falta o estoy haciendo algo mal?
Respuestas
Si 0xff00ffb7
está destinado a ser un uint64_t
para 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 long
o unsigned long long
,: el primero que "encaja". Con 32 bits int/unsigned
, 0xff00ffb7
sería unsigned
y probablemente la fuente de problemas de OP.
Agregar u
una constante es una buena idea para asegurarse de que sea de algún tipo sin firmar.
Agregar L
o LL
a una constante no es una buena idea para asegurar que una constante sea uint64_t
. Cualquiera puede coincidir (a LL
menudo lo hará), pero estos sufijos no garantizan ese tipo.
El uso de UINT64_C(0xff00ffb7)
forma una constante de tipo uint_least64_t
que ciertamente es la misma que uint64_t
en las máquinas que tienen uint64_t
.