sprintf()中的意外结果

P.A*_*SOW 3 c printf endianness

有人可以帮我理解发生了什么吗?

char pcMessage[255];
iMsgAllocatedLength=255;
unsigned long long ullRecordID = 135290303ULL;
sprintf_s(pcMsg, iMsgAllocatedLength, "%08X;%llu", ullRecordID, ullRecordID);
Run Code Online (Sandbox Code Playgroud)

给出以下结果

08105DBF ; 581067426850930688;

sprintf_s(pcMsg, iMsgAllocatedLength, "%010llu;%08X;", ullRecordID, ullRecordID);
Run Code Online (Sandbox Code Playgroud)

给出预期的结果

0135290303; 08105DBF

请注意,我只是颠倒了订单,并注意到
581067426850930688是08105DBF 00000000

请帮我理解.

das*_*ght 8

打印unsigned long long使用%X格式说明符是未定义的行为,因为sprintf需要unsigned intfor %X.当您通过不幸的巧合切换说明符时,它会产生正确的结果.不同平台上的行为可能不一样.

使用%llX打印值:

sprintf_s(pcMsg, iMsgAllocatedLength, "%08llX;%llu", ullRecordID, ullRecordID); 
Run Code Online (Sandbox Code Playgroud)