Passagem incorreta de uint_64_t para va_list
Estou escrevendo uma printf
função personalizada e uint64_t
parece ter sido passado incorretamente para va_list
:
Ponto problemático:
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
Parte da minha printf
implementação que produz o resultado incorreto:
format++;
uint64_t num = va_arg(parameters, uint64_t);
Ao depurar com gdb, o valor de num
torna-se em 0xffffffffff00ffb7
vez do 0xff00ffb7
que eu esperava, e para o próximo %C
num
torna-se 0. Este é algum comportamento padrão que estou perdendo ou estou fazendo algo errado?
Respostas
Se 0xff00ffb7
for para ser uma uint64_t
função variável, lance-a.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
, como uma constante inteira, tem o tipo de int, unsigned, long, unsigned long, long long
ou unsigned long long
,: o primeiro ele "se ajusta". Com 32 bits int/unsigned
, 0xff00ffb7
seria unsigned
e provavelmente a origem do problema do OP.
Anexar u
a uma constante é uma boa ideia para garantir que seja algum tipo sem sinal.
Anexar L
ou LL
a uma constante não é uma boa ideia para garantir que uma constante seja uint64_t
. Qualquer um pode corresponder ( LL
geralmente corresponderá), mas esses sufixos não garantem esse tipo.
O uso de UINT64_C(0xff00ffb7)
formas é uma constante do tipo uint_least64_t
que é certamente a mesma que uint64_t
em máquinas que o têm uint64_t
.