C语言 大于 UINT32 的数字的 sprintf 格式说明符



我正在尝试使用sprintf将两种uint32_t类型的总和打印到缓冲区中。它们的总和可能大于uint32_max,因此我将结果捕获到int64_t中。这是我尝试过的一个小片段:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main()
{
char tmp[100] = {0};
int64_t num = UINT32_MAX+2;
sprintf(tmp, "%" PRId64, num);
printf("A: %sn", tmp);
return 0;
}

答案是A: 1[gcc],这意味着值溢出。期望值为4294967295 + 2 = 4294967297。以前的答案建议使用说明符PRId64但这似乎没有帮助。你能指出我在这个片段中的错误吗?

问题不在于格式,而在于数学!

int64_t num = UINT32_MAX + 2;

加法的参与者都是 32 位值,结果也是如此:模 2^32 产生1的结果。

如果将LL添加到常量的末尾,则会使其中一个操作数变为 64 位,因此加法也是 don

int64_t num = UINT32_MAX + 2LL;

最新更新