将字符串转换为signed int

时间:2010-09-25 05:27:13

标签: c string int signed

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

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

7 个答案:

答案 0 :(得分:4)

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

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

char *buf = "fb869e";
long n;

n = strtol(buf, NULL, 16);
if (n > 0x7fffffL)
    n -= 0x1000000L;

答案 1 :(得分:1)

其他人建议strtol()。我只想提及sscanf()作为替代,例如:

int i;
char *buf = "fb869e";
if (sscanf(buf, "%x", &i) == 1)
   ...

答案 2 :(得分:0)

0xfb869e == 0x00fb869e == 16483998

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

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

long n = strtol(...);
if (n > 0xffffff) n |= 0xff000000;

答案 3 :(得分:0)

strtol将字符串转换为长整数

输出正确,它将是16483998

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

答案 4 :(得分:0)

为什么0x00fb869e应为负数?你应该提供你的号码系统的基础,甚至可以告诉你,一种格式的值是否是另一种格式的否定

答案 5 :(得分:0)

使用strtolstring转换为long整数。

答案 6 :(得分:0)

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

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

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

Output is:

value x: 820 - 2080