将字符串转换为signed int

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

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

hex数0xfb869e 不是负数。 内置数字转换函数不会将其转换为负值,因为其值为正。

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

 char *buf = "fb869e"; long n; n = strtol(buf, NULL, 16); if (n > 0x7fffffL) n -= 0x1000000L; 

其他人建议使用strtol() 。 我只想提一下sscanf()作为替代方案,例如:

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

strtol将字符串转换为长整数

输出正确,它将是16483998

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

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

 0xfb869e == 0x00fb869e == 16483998 

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

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

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

使用strtolstring转换为long整数。