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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:50:31