C 语言中为什么没有直接提供二进制数的输出?

有八进制、十进制、十六进制,为什么没有提供二进制?
关注者
10
被浏览
15,832

6 个回答

我无法得知为什么 C 标准库没有提供将整数转换为使用二进制表示的字符串的手段。不负责任推测,可能是因为早期 Unix 开发缺乏对二进制表示的需求,或者是因为二进制表示占用的字符数量太大,为了节约纸张(早期终端输出是使用专用的行式打印机打印在纸上的)而没有实现转换成二进制表示的功能。

不过,诸如微软 C 运行库和 GNU C Library 的主流运行库都实现了一个可以将整数转换成 2、8、10、16 进制的非标准函数 itoa (现均改名 _itoa )。这个函数的实现并不困难,不需要任何操作系统 API 或平台相关特性,可以出一道难度较低的算法题。

下面给出通过微软 C 运行库的早期实现还原出的大致源代码。这段代码的具体版本暂时无法得知,只知道属于 Microsoft C 某个版本的 C 运行库:

char * itoa(int value, char * str, int base)
    unsigned int _value;
    unsigned int digit;
    char * pointer;
    char * head;
    char swap_temp;
    pointer = str;
    _value = (unsigned int)value;
    /* 十进制下,如果value是负数,则向字符串写入一个负号,然后取value的相反数 */
    if (base == 10 && value < 0) {
        *pointer++ = '-';
        _value = (unsigned int)(-(int)value);
    /* 记录第一个数字字符出现的位置 */
    head = pointer;
    /* 循环取出数值在目标进制下的最低位,转换成对应的字符后写入字符串 */
    do {
        digit = _value % (unsigned int)base;
        _value /= (unsigned int)base;
        /* 将数值转换成ASCII数字字符 */
        digit += 0x30U;
        if (digit > 0x39U) {
            /* 将大于10的数值转换成ASCII小写字母 */
            digit += 0x27U;
        *pointer++ = (char)digit;
    } while (_value != 0U);
    /* 写入结尾空字符 */
    *pointer = '\0';
    /* 转换出来的数字部分是倒序的,使用前后双指针法将数字部分的顺序翻转过来 */
    do {
        pointer -= 1;
        swap_temp = *head++;