C语言中从argv取值打印unsigned char二进制位异常求助
问题:从argv传入字符'2'转换后打印二进制位与直接传数值2结果不符
我需要打印unsigned char类型的二进制位,目标值为2,但通过argv[1][0]强制转换后输出结果错误,直接传入数值2则结果正确。调试发现从argv传入时,实际传入的是字符'2'的ASCII值,而非数值2,希望得到解决方法。
代码实现
void print_bits(unsigned char octet) { int i; unsigned char b; i = 8; while (i--) { b = (octet >> i & 1) + '0'; write(1, &b, 1); } } int main(int argc, char **argv) { print_bits((unsigned char)argv[1][0]); write(1, "\n", 1); print_bits(2); write(1, "\n", 1); return (0); }
运行输出
00110010 00000010
问题分析
核心是类型转换逻辑错误:
argv[1][0]是命令行参数字符串里的字符'2',它的ASCII码值为50(对应二进制输出00110010),强制转unsigned char后传递的是50,不是目标数值2。- 直接传数值2时,传递的是整数2(对应二进制
00000010),这才是期望的目标值。
解决方案
要把字符形式的数字转成对应整数值,利用ASCII码的连续性,通过字符 - '0'的方式得到数值,再转成unsigned char。同时建议增加参数合法性检查,避免非法输入出错。
修改后的main函数示例:
int main(int argc, char **argv) { if (argc > 1 && argv[1][0] >= '0' && argv[1][0] <= '9') { unsigned char value = (unsigned char)(argv[1][0] - '0'); print_bits(value); write(1, "\n", 1); } print_bits(2); write(1, "\n", 1); return (0); }
说明
ASCII表中'0'到'9'是连续排列的,所以'2' - '0'会计算出整数2,转成unsigned char后传给print_bits的就是正确目标值,此时输出会和直接传2的结果一致。
内容的提问来源于stack exchange,提问作者drowninreverb
相关产品推荐
相关产品推荐

