Неправильная передача uint_64_t в va_list
Я пишу пользовательскую 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. Это какое-то стандартное поведение, которое мне не хватает, или я делаю что-то не так?
Ответы
Если 0xff00ffb7
предназначен uint64_t
для переменной с переменным числом аргументов, приведите его.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
, как целочисленная константа, имеет тип int, unsigned, long, unsigned long, long long
or unsigned long long
,: первая из них "подходит". С 32-бит int/unsigned
, 0xff00ffb7
будет unsigned
и , вероятно , источником проблем ФП в.
Добавление u
к константе - хорошая идея, чтобы убедиться, что это какой-то беззнаковый тип.
Добавление L
или LL
к константе - не лучший вариант, чтобы застраховать константу uint64_t
. Любой из них может совпадать ( LL
часто будет), но эти суффиксы не гарантируют этот тип.
Использование UINT64_C(0xff00ffb7)
формирует константу типа, uint_least64_t
которая точно такая же, как uint64_t
на машинах, у которых есть uint64_t
.