You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中字符串转十六进制为何需要使用0xFF?

为何char转十六进制时未用0xFF会多出FFFFFF?

先看你运行的代码和输出:

代码:

#include <stdio.h>

int main (int argc, char *argv[])
{
    char str[] = { 0x58, 0x01, 0x02, 0x20, 0x22, 0x00, 0xC5};
    char hex[32] = {0}, hex2[32] = {0};

    for (int i = 0; i < sizeof(str); i++) {
        sprintf(hex + i*2, "%02X", str[i]);
    }

    for (int i = 0; i < sizeof(str); i++) {
        sprintf(hex2 + i*2, "%02X", str[i] & 0xff);
    }

    printf("hex = %s\nhex2 = %s\n", hex, hex2);
    return 0;
}

输出:

hex = 580102202200FFFFFFC5
hex2 = 580102202200C5

原因拆解:

  • 多数编译器下,char是有符号类型。你数组里的0xC5值大于有符号char的最大值0x7F,会被解释为负数(对应十进制-59)。
  • 当把这个有符号char传给sprintf的%02X格式符时,char会自动提升为int类型。负数做类型提升时会触发符号扩展:原char的最高位是1(0xC5二进制最高位为1),扩展成int时所有高位都会被填充为1,最终变成0xFFFFFFC5。
  • %02X的02只是指定输出至少2位,但它会输出整个int的所有非零高位,所以就出现了多余的FFFFFF。

而加上& 0xff后:

  • 0xff是8位无符号掩码,str[i] & 0xff会直接清零char的高位,只保留低8位,不管原char正负,结果都会变成无符号的0xC5。
  • 这个值提升为int时会触发零扩展,变成0x000000C5,%02X输出时就只会显示C5,不会有多余高位。

内容的提问来源于stack exchange,提问作者Orivee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:25:39