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