将字符串转换为有符号整数

4

我想将一个字符串转换为有符号整数。以下是要求。我已经将十六进制值作为字符串存储在缓冲区中。现在我想将该值转换为有符号整数。

buf = "fb869e" 将其转换为有符号整数。因此输出应为-293218。但是当我尝试使用strtol进行转换时,我得到的是16483998。那我该怎么办?


你从哪里得知0xfb869e是-293218的?strtol函数其实是正确的。 - vanza
1
我认为很明显是C语言,他正在使用strtol()函数。 - st0le
为什么输出应该是-293218?顺便提一下,strtol的返回类型是long int。 - Nyan
有点重复: https://dev59.com/43NA5IYBdhLWcg3wKaYx - Adi_aks
7个回答

5

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

你想要的是这个数字的24位二进制补码负数的无符号十六进制表示。获取方法是将其转换为正数,然后使用计算将其转换为24位二进制补码等效形式:

char *buf = "fb869e";
long n;

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

1

其他人建议使用 strtol()。我想提一下另一种选择,即 sscanf(),例如:

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

0
0xfb869e == 0x00fb869e == 16483998

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

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

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

char buf = "fb869e" - 我想将其转换为有符号整数。输出应该是-293218。我尝试将字符串转换为长整型,但我没有得到负值。 - ulaganathan
char buf = "fb869e"。我想将其转换为有符号整数,输出应该是-293218。我尝试使用strtol将字符串转换为长整型,但我没有得到负值。我的十六进制值如下。我需要有符号整数的输出。 "C编程" 80000e fcc15e 7ffffe 0b778e 80000e ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe - ulaganathan
@ulganathan:我的答案中有一个错误。请使用 if (n > 0x7fffff)... - Marcelo Cantos

0

0

为什么0x00fb869e应该是一个负数?你必须提供你的数字系统的基础,才能判断一个格式中的值是否在另一个格式中是负数。


char buf = "fb869e"。我想将其转换为有符号整数,输出应为-293218。我的十六进制值如下。我需要有符号整数的输出。 80000e fcc15e 7ffffe 0b778e 80000e ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe - ulaganathan

0
使用 strtol 函数将 string 转换为 long 整型。

0

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

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

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

Output is:

value x: 820 - 2080

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接