0

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

4

4 回答 4

3

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

unsigned int test;
int result;

sscanf("0xfff6","%x", &test);
result = (int16_t) test;
于 2013-02-10T21:53:52.073 回答
0

的值test大于 32k 的事实表明它是一个“长”整数(32 位)......因此它看不到符号位。您必须将值读入无符号短整数,然后将其类型转换为有符号短整数,才能看到负值...

于 2013-02-10T21:54:15.570 回答
0

我认为核心问题是您假设 int 是 16 位,而在您的系统中它似乎比这更大。

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

尝试将您的代码从 int text 更改为 short test,我怀疑它会起作用。

于 2013-02-10T21:55:42.000 回答
0

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

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

if (val > 32767) val -= 65536;

这将设置最高位(以 16 位计)的值调整为负数。

于 2013-02-10T21:57:08.770 回答