【问题标题】:C Programming: Convert Hex Int to Char*C 编程:将 Hex Int 转换为 Char*
【发布时间】:2026-02-16 03:40:01
【问题描述】:

我的问题是我将如何转换如下内容:

    int i = 0x11111111;

到一个字符指针?我尝试使用 itoa() 函数,但它给了我一个浮点异常。

【问题讨论】:

  • 你的意思是 char *cp = (char * ) i; ?
  • 没有“hex int”这样的东西。这只是一个普通的int,您恰好以十六进制表示形式指定了它的值。
  • 这不是“十六进制整数”。这只是一个“int”。 “Hex int”是整数的一种表示形式。或以 16 为基数的值的视图。要将 int 转换为任何类型的指针,只需将其强制转换: char * p = ( char * )i;然而,这可能不是一个很好的做法。
  • 你想要(char*)0x11111111,还是"0x11111111"
  • @Bhubhu:我敢打赌,当您投射它时,它不会出现分段错误。我敢打赌,当您使用该指针执行某些操作时,会出现分段错误。如果你不展示你的代码,那么人们就会对它做出错误的猜测,浪费大家的时间。

标签: c char int


【解决方案1】:
char buffer[20];

然后:

sprintf(buffer, "%x", i);

或者:

itoa(i, buffer, 16);

指向缓冲区的字符指针可以是buffer本身(但它是const)或其他变量:

char *p = buffer;

【讨论】:

    【解决方案2】:

    itoa 是非标准的。远离。

    一种可能性是使用sprintf 和正确的十六进制格式说明符,即x 并执行以下操作:

    char str[ BIG_ENOUGH + 1 ];
    sprintf(str,"%x",value);
    

    但是,这个计算value 数组的大小的问题。您必须进行一些猜测,FAQ 12.21 是一个很好的起点。

    表示任何基数 b 中的数字所需的字符数可以通过以下公式近似:

    ⌈logb(n + 1)⌉

    如果需要,再添加几个来保存0x,然后您的BIG_ENOUGH 就准备好了。

    【讨论】:

    • 对于 int(4 字节),足够的大小很容易确定:9 表示十六进制,11 表示十进制,33 表示二进制。
    • @Ruben:没有0x 十六进制前缀,是的。
    • 当然,没有前缀 - 仅适用于数字本身和字符串末尾的 \0。
    【解决方案3】:

    像这样使用 sprintf() 函数 -- sprintf(charBuffer, "%x", i); -- 我认为会很好用。

    【讨论】:

    • @octopusgrabbus:你为什么要添加演员表?它根本没有提供任何好处,并且可能有害(禁用有用的编译器警告,这些警告会在编译期间捕获类型错误而不是在运行时崩溃)。
    • @BenVoigt 感谢您接受此消息。我不再用 C 编写足够的程序,只是完全忘记了这条规则。
    • 您批准@BenVoigt 的编辑被拒绝。我刚刚又提交了。
    • 我回滚了这个答案。 @octopusgrabbus - 如果您想回答问题,请作为答案。请不要编辑其他答案来添加您自己的代码。
    【解决方案4】:

    使用sprintf() 函数将整数转换为十六进制应该可以完成您的任务。

    这是一个例子:

    int i = 0x11111111;
    
    char szHexPrintBuf[10];
    
    int ret_code = 0;
    
    ret_code = sprintf(szHexPrintBuf, "%x", i);
    
    if(0 > ret_code)
    { 
       something-bad-happend();
    }
    

    【讨论】: