Неправильная передача 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становится, 0xffffffffff00ffb7а не 0xff00ffb7ожидаемым, а для следующего %C numстановится 0. Это какое-то стандартное поведение, которое мне не хватает, или я делаю что-то не так?

Ответы

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 longor unsigned long long,: первая из них "подходит". С 32-бит int/unsigned, 0xff00ffb7будет unsignedи , вероятно , источником проблем ФП в.

Добавление uк константе - хорошая идея, чтобы убедиться, что это какой-то беззнаковый тип.

Добавление Lили LLк константе - не лучший вариант, чтобы застраховать константу uint64_t. Любой из них может совпадать ( LLчасто будет), но эти суффиксы не гарантируют этот тип.

Использование UINT64_C(0xff00ffb7)формирует константу типа, uint_least64_tкоторая точно такая же, как uint64_tна машинах, у которых есть uint64_t.