为什么在使用 64 位(long long)时 printf 与 %lld return 的数字与 %16x 的数字不同?

Why does printf with %lld return a different number than with %16x when using 64 bit (long long)?

我正在从 HPS 运行 Linux 访问 FPGA 上的内存,我偶然发现了一个问题。

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

returns 我期望的十六进制格式的值,而


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

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

returns 向左移动 32 位的值。我得到正确的结果:

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

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

我很困惑,因为变量本身具有相同的值,我错过了什么?

当您使用 "%16x" 时,printf 将给定值处理为 unsigned int

请告诉 printf 值是 long long,方法是:"%16llx"

来自 printf 的手册页:

ll

(ell-ell). A following integer conversion corresponds to a long long int or unsigned long long int argument, or a following n conversion corresponds to a pointer to a long long int argument.