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

C 大于UINT32的数字的sprintf格式说明符,c,printf,C,Printf,我正在尝试使用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; sprin

我正在尝试使用
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: %s\n", tmp);

    return 0;
}

#包括
#包括
#包括
int main()
{
char tmp[100]={0};
int64_t num=UINT32_MAX+2;
sprintf(tmp,“%”PRId64,num);
printf(“A:%s\n”,tmp);
返回0;
}

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

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

int64_t num = UINT32_MAX + 2;
加法的参与者都是32位值,结果也是如此:模2^32产生的结果是
1

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

int64_t num = UINT32_MAX + 2LL;

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

int64_t num = UINT32_MAX + 2;
加法的参与者都是32位值,结果也是如此:模2^32产生的结果是
1

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

int64_t num = UINT32_MAX + 2LL;

哦,哇,谢谢!在变量[加法LL部分]的情况下,我如何处理这个问题?例如a+b,其中两个都是uint32_最大值?是否将其中一个强制转换为64位类型<代码>int64_t num=a+(int64_t)b我想提醒你,在没有真正理解整体升级规则的情况下,不应该仅仅抛出一个强制转换,你必须知道签名和未签名是如何在一起玩的,如果你弄错了,你最终会得到不愉快的截断惊喜,比如今天提示你访问堆栈溢出的:-)以避免强制转换(好事情),只需包含一个更宽的0<代码>0LL+a+b。相信编译器会发出高效的代码。@chux现在这是一个非常好的主意。噢,哇,谢谢!在变量[加法LL部分]的情况下,我如何处理这个问题?例如a+b,其中两个都是uint32_最大值?是否将其中一个强制转换为64位类型<代码>int64_t num=a+(int64_t)b我想提醒你,在没有真正理解整体升级规则的情况下,不应该仅仅抛出一个强制转换,你必须知道签名和未签名是如何在一起玩的,如果你弄错了,你最终会得到不愉快的截断惊喜,比如今天提示你访问堆栈溢出的:-)以避免强制转换(好事情),只需包含一个更宽的0<代码>0LL+a+b。相信编译器能发出高效的代码。@chux现在这是个好主意。