程序十进制输出正常,用char获取十六进制值却输出?求解
排查char类型输出十六进制字符为"?"的问题
首先,咱们聚焦核心问题:你用char类型输出十六进制字符却显示"?",本质上是计算出的数值没有映射到正确的ASCII可打印字符区间,这和你处理前4位二进制的逻辑直接相关,咱们一步步拆解排查:
1. 先明确十六进制字符的ASCII对应规则
十六进制字符0-9、A-F(或a-f)对应的ASCII码是固定范围的:
- 数字0-9:ASCII值为
48('0')到57('9') - 大写字母A-F:ASCII值为
65('A')到70('F') - 小写字母a-f:ASCII值为
97('a')到102('f')
你处理前4位二进制得到的数值范围是0-15(4位二进制最大是1111=15),如果直接把这个0-15的数值赋值给char,对应的都是ASCII控制字符(比如0是空字符、15是换页符),这些都是不可打印的,自然会显示成"?"。
2. 检查数值转char的运算逻辑
已知你可以对char值进行运算,那大概率是你没给计算出的0-15数值加上正确的偏移量。举两个正确的映射逻辑例子供你对照:
- 输出大写十六进制字符:
// 假设val是前4位二进制转成的0-15的数值 char hex_char; if(val <=9){ hex_char = val + '0'; // 0-9 → '0'-'9' } else { hex_char = val -10 + 'A'; //10-15 → 'A'-'F' } - 输出小写十六进制字符:
char hex_char; if(val <=9){ hex_char = val + '0'; } else { hex_char = val -10 + 'a'; }
你可以先核对自己的映射代码,是不是没做这个偏移处理,直接把val赋值给了char变量。
3. 额外验证点
- 先打印下你处理前4位二进制得到的
val值,确认它确实是0-15之间的正确数值(虽然你说十进制输出正确,但这一步可以排除数值计算错误); - 如果你用的是有符号char类型(部分编译器默认char是有符号的),虽然0-15不会触发溢出,但也可以强制转成unsigned char来输出,避免潜在的符号问题:
printf("%c", (unsigned char)hex_char);
内容的提问来源于stack exchange,提问作者Muhammad Shaeel Abbas
相关产品推荐
相关产品推荐

