4

我想将字符串转换为带符号的 int。以下是要求。我已将十六进制值作为字符串存储在缓冲区中。现在我想将该值转换为带符号的 int。

buf = "fb869e"将其转换为带符号的 int。所以 o/p 应该是 -293218。但是当我尝试使用 strtol 进行转换时,我得到 16483998。那我该怎么办?

4

7 回答 7

4

十六进制数0xfb869e不是负数。内置数字转换函数不会将其转换为负值,因为它的值为正。

您所说的是,这是 24 位 2s 补码负数的无符号十六进制等价物,并且您想要那个数字。获得它的方法是将其转换为正数,然后使用计算将其转换为等效的 24 位 2s 补码:

char *buf = "fb869e";
long n;

n = strtol(buf, NULL, 16);
if (n > 0x7fffffL)
    n -= 0x1000000L;
于 2010-09-25T06:16:00.437 回答
1

其他人已经建议了strtol()。我只想提sscanf()一个替代方案,例如:

int i;
char *buf = "fb869e";
if (sscanf(buf, "%x", &i) == 1)
   ...
于 2010-09-25T06:57:57.873 回答
0
0xfb869e == 0x00fb869e == 16483998

作为有符号整数,必须将高位设置为产生负数。由于未设置给定数字的高位,因此它必须为正数。

如果您希望将数字视为 24 位数字,则必须将第 23 位填充到剩余的高位。这是一种方法:

long n = strtol(...);
if (n > 0xffffff) n |= 0xff000000;
于 2010-09-25T05:34:45.363 回答
0

strtol 将字符串转换为长整数

输出是正确的,它将是 16483998

如果您使用 atoi,当它转换为字符串到整数时,如果超出可表示值的范围,则返回正确的值 INT_MAX 或 INT_MIN。

于 2010-09-25T05:35:55.580 回答
0

为什么 0x00fb869e 应该是负数?你应该提供你的数字系统的基础,甚至被允许判断一种格式的值是否是另一种格式的负数

于 2010-09-25T05:36:44.633 回答
0

使用strtolwhich 转换stringlong整数。

于 2012-06-20T23:39:28.450 回答
0

试试下面的代码块,它对我有用。

char *p = "0x820";
uint16_t intVal;
sscanf(p, "%x", &intVal);

printf("value x: %x - %d", intVal, intVal);

Output is:

value x: 820 - 2080
于 2019-10-16T06:25:00.597 回答