我的计划中有一行代码如下:sprintf (line, "%s [%lu..%lu]", pp->help, min, max);
其中min, max;
为unsigned long
而line
为char[SOME_SIZE]
。在调用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);
但这不起作用。 if是真的,但是当我打印行时,我仍然得到正数(即4294967291
),我该如何解决这个问题?
注意:我不确定在执行结束时如何实现打印,但现在sprintf
本身无法正常工作,因为它添加了未签名而不是签名。
这是我的代码的简化:
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);
}
编辑:我试图在我的gcc上获得类似的结果,但失败了。但我看到一些非常奇怪的东西可以解释这个。声明line
时,它是char[]
,但当调试器到达sprintf
时,line
被标识为unsigned char
......但遗憾的是我可以' t在这里发布代码。