【问题标题】:convert string into signed int将字符串转换为有符号整数
【发布时间】:2024-01-07 05:21:01
【问题描述】:

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

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

【问题讨论】:

标签: c string int signed


【解决方案1】:
0xfb869e == 0x00fb869e == 16483998

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

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

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

【讨论】:

  • char buf = "fb869e" - 我想转换成有符号整数。 o/p 应该是 -293218。我只是尝试将字符串转换为长整数。但我没有得到负值。
  • char buf = "fb869e"。我想将其转换为带符号的 int。所以 o/p 应该是 -293218。我只是尝试使用 strtol 将字符串转换为长字符串。但我没有得到负值。我的十六进制值如下。我需要带符号整数的o/p。 《C 编程》80000e fcc15e 7ffffe 0b778e 80000e ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe
  • @ulganathan:我的回答中有一个错误。请改用if (n > 0x7fffff)...
【解决方案2】:

strtol 将字符串转换为长整数

输出正确,为 16483998

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • char buf = "fb869e"。我想将其转换为带符号的 int。所以 o/p 应该是 -293218。我的十六进制值如下。我需要带符号整数的o/p。 80000e fcc15e 7ffffe 0b778e 80000e ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe
    【解决方案4】:

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

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

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

    【讨论】:

    • 非常感谢....这件事让我在过去 3 个小时里搞砸了...再次感谢您的帮助....
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      使用strtolstring 转换为long 整数。

      【讨论】:

        【解决方案7】:

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

        char *p = "0x820";
        uint16_t intVal;
        sscanf(p, "%x", &intVal);
        
        printf("value x: %x - %d", intVal, intVal);
        
        Output is:
        
        value x: 820 - 2080
        

        【讨论】:

          最近更新 更多