使用sprintf为char*分配负片
我的程序中有一行代码如下:使用sprintf为char*分配负片,c,printf,signed,C,Printf,Signed,我的程序中有一行代码如下:sprintf(行,“%s[%lu..%lu]”,pp->help,min,max)其中最小值,最大值是无符号长的和行是字符[某些大小]。在调用sprintf之前,我调用一个函数,该函数可以为min分配负数,min得到-5的值,该值转换为4294967291,因为它是无符号的 所以我试着做一些类似的事情: if((long)min < 0) // works fine because 4294967291 has the binary of 0x1...
sprintf(行,“%s[%lu..%lu]”,pp->help,min,max)代码>其中<代码>最小值,最大值代码>是无符号长的
和行
是字符[某些大小]
。在调用sprintf
之前,我调用一个函数,该函数可以为min
分配负数,min得到-5
的值,该值转换为4294967291
,因为它是无符号的
所以我试着做一些类似的事情:
if((long)min < 0) // works fine because 4294967291 has the binary of 0x1...
sprintf (line, "%s [%d..%d]", pp->help, (long)min, max);
编辑:我试图在gcc上获得类似的结果,但失败了。但我看到了一些非常奇怪的东西可以解释这一点。声明line
时,它是char[]
,但当调试器到达sprintf
时,line
被标识为无符号char
。。。但遗憾的是,我不能在这里发布代码 请编辑您的问题,并告诉我们您希望得到什么值的输出。1)您使用无符号长字符
的任何原因,尽管您显然想要有符号长字符
?2) 提供一个。3) 听起来像是XY问题(请参见1)4)无符号到有符号的转换是由实现定义的。您的实现指定了哪些行为?无法复制,请单击此处->对我有效。请准确编辑您得到的内容(不是“不起作用”)和您期望的内容(具体值),因为这可以提供错误的线索。例如,根据编译器/平台的不同,您可能需要签名输出的%ld
。查看为max打印的内容(以及应该打印的内容)可能有助于确定''%1'是有符号长字符串的正确格式字符串,而不是''%d'。也许这就是问题的原因
unsigned long min = foo() /* in this case -5 */, max = goo() /* in this case 5*/;
char line[100];
if((long)min < 0){
sprintf (line, "%s [%d..%d]", pp->help, (long)min, max);
}// when it prints I get [4294967291..5] instead of [-5..5]
else{
sprintf (line, "%s [%lu..%lu]", pp->help, min, max);
}