Почему printf с% lld возвращает значение, отличное от% 16x, при использовании 64-битного (long long)? - PullRequest
2 голосов
/ 07 июня 2019

Я обращаюсь к памяти на FPGA из HPS под управлением Linux, и наткнулся на проблему.

    {
        long long address_debug = *(shared_memory + i);
        printf("index: %i - value: %16x \n", i, address_debug);
    }

возвращает ожидаемые значения в шестнадцатеричном формате, тогда как


    for (i = 0; i < 700; i++)
    {
        long long address_debug = *(shared_memory + i);

            printf("index: %i - value: %lld \n", i, address_debug);
    }

возвращает значения, сдвинутые на 32 бита влево.Я получаю правильные результаты с:

printf("index: %i - value: %lld \n", i, address_debug>>31);

или

printf("index: %i - value: %llu \n", i, address_debug>>31);

Я в замешательстве, так как сама переменная имеет то же значение, что мне не хватает?

1 Ответ

3 голосов
/ 07 июня 2019

Когда вы используете "%16x", printf обрабатывает данное значение как unsigned int.

Пожалуйста, сообщите printf, что значение равно long long, используя: "%16llx"

С справочной страницы printf:

LL

(ELL-ELL). Следующее целочисленное преобразование соответствует длинному длинному int или unsigned long long int аргумент, или следующее n преобразование соответствует указателю на длинный длинный аргумент int.

...