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
相关产品推荐
相关产品推荐

