Что происходит и как работает функция printf(), если вводится не кореректный спецификатор (%llx - 64 бита) для типа данных int, long (32 бита)?
При изучении логических операции ошибся в коде и указал неправильный спецификатор. Далее начал разбираться почему функция printf() выводит такой поток.
В строке 18 вывел данные типа unsigned lond в шестнадцатеричном виде со спецификатором %lx. Вывод в консоль корректный.
Я подумал, что если указан спецификатор для переменной неправильный, например %llx вместо %lx (64 бита вместо 32 бит), то функция printf() возьмет из памяти с начала адреса переменной (worddata - адрес 0х0061fef4) и выведет 64 бита в шестнадцатеричном виде. Начал смотреть значения в дампе, но ответа не нашел.
Почему выводится дополнительно значения 12345678? Если программист ошибся в спецификаторе, то что происходит?
Я бы понял, если бы увидел значение 9abcdef19abcdef1. Данные значения видны в скриншоте. Получилось бы, что как будто мы прочитали часть памяти хранящую dworddata. Но видимо функция printf() работает по другому.
#define LOWDWORD(num) ((unsigned long) (num & 0xffffffff))
#define HIGHDWORD(num) ((unsigned long) (num >> 32 & 0xffffffff))
int main()
{
long long unsigned dworddata;
dworddata = 0x123456789abcdef1;
printf("%s %llx %llu\n", "dworddata is"\
, dworddata, dworddata);
printf("%p\n", &dworddata);
unsigned long worddata;
printf("%p\n", &worddata);
worddata = LOWDWORD(dworddata);
printf("%s %lx\n", "worddata is", worddata);
printf("%s %llx\n", "worddata is", worddata); // разбираюсь с этой строчкой
return 0;
}
