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