为什么C中的printf()不能同时打印两个64位值?

Jee*_*tel 8 c printf

我正在研究一个32位系统.当我尝试在单个printf中打印多个64位值时,它无法再打印(即第2,第3 ......)个变量值.

例:

uint64_t a = 0x12345678;
uint64_t b = 0x87654321;
uint64_t c = 0x11111111;

printf("a is %llx & b is %llx & c is %llx",a,b,c);
Run Code Online (Sandbox Code Playgroud)

为什么这个printf不能打印所有值?

我正在修改我的问题

printf("a is %x & b is %llx & c is %llx",a,b,c);
Run Code Online (Sandbox Code Playgroud)

通过这样做的结果是:a是12345678&b是8765432100000000&c是1111111100000000

如果我没有正确打印一个值,那么为什么其他的价值才会变化?

Vin*_*ura 14

您应该使用中定义的宏 <inttypes.h>

printf("a is %"PRIx64" & b is %"PRIx64" & c is %"PRIx64"\n",a,b,c);
Run Code Online (Sandbox Code Playgroud)

这很难看,但它很便携.这是在C99中引入的,因此您需要符合C99的编译器.

  • 你坚持使用`PRIx64`等是完全正确的.但是我猜测OP的不同之处只是格式字符串末尾的`\n` ... (2认同)

小智 11

您需要使用正确的格式:

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

int main(void)
{
    uint64_t a = 0x12345678;
    uint64_t b = 0x87654321;
    uint64_t c = 0x11111111;

    printf("a is %#" PRIx64
            " & b is %#" PRIx64
            " & c is %#" PRIx64 "\n",
            a, b, c);
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

输出:

a is 0x12345678 & b is 0x87654321 & c is 0x11111111
Run Code Online (Sandbox Code Playgroud)