为什么在使用 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.
我正在从 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.