【问题标题】:C - Convert long int to signed hex stringC - 将 long int 转换为有符号的十六进制字符串
【发布时间】:2011-02-14 00:06:59
【问题描述】:

大规模编辑:

我有一个 long int 变量,我需要将其转换为一个有符号的 24 位十六进制字符串,并且开头没有“0x”。字符串必须为 6 个字符,后跟字符串终止符 '\0',因此需要添加前导零。

示例: [-1 -> FFFFFF] --- [1 -> 000001] --- [71 -> 000047]

回答 这似乎可以解决问题:

long int number = 37;
char string[7];

snprintf (string, 7, "%lX", number);

【问题讨论】:

  • 只是为了澄清,你所说的签名十六进制是什么意思,例如-1 应该转换成什么?
  • FFFFFF(如果我已经完成了我的转换:s)
  • 好的,这看起来像是转换为无符号长整数并打印无符号十六进制数。
  • 所以你真的想要一个 24 位的十六进制字符串?
  • %lx 转换需要unsigned long,但您传递给它的是long。尽管它按原样为您工作,但为了形式上的正确性,需要转换为 unsigned long。您当前的方法也会为大多数负数提供错误的值 - 例如尝试 -256。

标签: c integer hex typeconverter


【解决方案1】:

使用itoa。它将所需的基数作为参数。

或者再三考虑,不。使用符合标准的sprintf

【讨论】:

    【解决方案2】:

    看看sprintf%lx 说明符可以满足您的需求。

    【讨论】:

    • 此外,如果可以,您应该使用snprintf 而不是sprintf
    【解决方案3】:

    因为您只需要六位数字,您可能需要进行一些屏蔽以确保该数字符合您的要求。像这样的:

    sprintf(buffer, "%06lx", (unsigned long)val & 0xFFFFFFUL);
    

    请注意,您将所有长整数映射到小范围的表示中。您可能需要在打印之前检查数字是否在特定范围内(例如 -2^23

    【讨论】:

    • 这是目前唯一的完整答案(需要转换为unsigned long)。
    • 是什么决定了你附加什么映射?假设我在 32 位(8 个字符串)之后,那么你会添加什么映射? (显然你也会将格式标志更改为 08)
    • 实际上,映射是 x -> x (mod 2^24),所以数字 >2^24 环绕。使用 8 个字符的 32 位字符串,这将是 x -> x (mod 2^32) 这是否是注入(可逆)取决于相关平台上 unsigned long 的大小。
    【解决方案4】:

    在标题中你说你想要一个有符号的十六进制字符串,但你所有的例子都是无符号的十六进制字符串。假设示例是您想要的,最简单的方法是

    sprintf(buffer, "%06X", (int)value & 0xffffff);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 2018-01-31
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多