为什么snprintf在第二种情况下给出不同的值。是因为任何整数限制。你能解释一下snprintf是如何工作的以及为什么这个负值的原因
#include <stdio.h>
#include <string.h>
main()
{
char buff[256];
snprintf(buff,256,"%s %d"," value",1879056981);
printf("%s",buff);
}
输出:
value 1879056981
#include <stdio.h>
#include <string.h>
main()
{
char buff[256];
snprintf(buff,256,"%s %d"," value",2415927893);
printf("%s",buff);
}
输出:
value -1879039403
答案 0 :(得分:1)
这是因为整数2415927893
不能用你系统上的任何整数类型表示,并且你的程序中有签名溢出。
整数文字的确切类型取决于数字的大小。 C11定义整数文字可以是int
或long int
或long long int
,具体取决于哪个符合 first 的顺序。
6.4.4.1整数常量
整数常量的类型是相应列表的第一个 其值可以表示。
打开编译器警告。
在我的系统上,当我用以下代码编译你的代码时,gcc会发出警告:
gcc -std=c11 -Wall -pedantic t.c
t.c:4:1: warning: return type defaults to ‘int’ [enabled by default]
t.c: In function ‘main’:
t.c:9:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 5 has type ‘long long int’ [-Wformat]
t.c:9:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 5 has type ‘long long int’ [-Wformat]
答案 1 :(得分:1)
文字2415927893被解释为int。由于它在您的计算机上大于INT_MAX,因此会出现溢出。
为避免这种情况,您可以将其解释为unsigned int:
snprintf(buff,256,“%s%u”,“value”,2415927893U);
或者长久以来:
snprintf(buff,256,“%s%lld”,“value”,241592789311);