具有十六进制负值的sscanf

时间:2013-02-10 21:49:15

标签: c hex scanf negative-number

我需要将十六进制的4位数值转换为十进制,所以我使用ssscanf,但它不适用于负数... 例如,     int test;     sscanf("0xfff6","%x",&test); 返回65526而不是-10。 我该如何解决?

4 个答案:

答案 0 :(得分:3)

你必须手动完成。 x转换说明符从unsigned int执行转换,它需要一个指向unsigned int的类型指针的参数。例如,使用演员:

unsigned int test;
int result;

sscanf("0xfff6","%x", &test);
result = (int16_t) test;

答案 1 :(得分:0)

test的值大于32k的事实表明它是一个“长”整数(32位)...因此它没有看到符号位。您必须将值读入无符号短整数,然后键入强制转换为有符号的短整数,以便查看负值...

答案 2 :(得分:0)

我认为核心问题是你假设int是16位,而在你的系统中它看起来比那个大。

Int始终是有符号的,因此它将结果报告为65525这一事实证明INT_MAX大于16位值36727。

尝试将代码从int文本更改为简短测试,我怀疑它会起作用。

答案 3 :(得分:0)

这可能是因为你的整数超过16位,因此fff6确实是正数 - 你可能需要fffffff6甚至更宽才能正确表示负数。

要解决此问题,只需将以下内容放在scanf

之后
if (val > 32767) val -= 65536;

将顶部位设置(以16位表示)调整为负值。