Что происходит и как работает функция 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;
}

Скриншот


Ответы (0 шт):