Passagem incorreta de uint_64_t para va_list

Jan 05 2021

Estou escrevendo uma printffunção personalizada e uint64_tparece 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 printfimplementação que produz o resultado incorreto:

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

Ao depurar com gdb, o valor de numtorna-se em 0xffffffffff00ffb7vez do 0xff00ffb7que eu esperava, e para o próximo %C numtorna-se 0. Este é algum comportamento padrão que estou perdendo ou estou fazendo algo errado?

Respostas

4 chux-ReinstateMonica Jan 05 2021 at 02:39

Se 0xff00ffb7for para ser uma uint64_tfunçã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 longou unsigned long long,: o primeiro ele "se ajusta". Com 32 bits int/unsigned, 0xff00ffb7seria unsignede provavelmente a origem do problema do OP.

Anexar ua uma constante é uma boa ideia para garantir que seja algum tipo sem sinal.

Anexar Lou LLa uma constante não é uma boa ideia para garantir que uma constante seja uint64_t. Qualquer um pode corresponder ( LLgeralmente corresponderá), mas esses sufixos não garantem esse tipo.

O uso de UINT64_C(0xff00ffb7)formas é uma constante do tipo uint_least64_tque é certamente a mesma que uint64_tem máquinas que o têm uint64_t.