C 语言探秘:二进制与八、十六进制转换大揭秘

文章目录

  • 一、 C语言中的二进制
  • 二、 二进制转八进制
  • 三、 二进制转十六进制

一、 C语言中的二进制

  • 在C语言中,数据在计算机内部是以二进制形式存储的。整数类型(如charintlong等)、浮点数类型(如floatdouble)等都有其对应的二进制表示。对于整数,有原码、反码和补码的概念。
  • 原码:是一种简单的二进制表示方法。最高位为符号位,0表示正数,1表示负数,其余位表示数值的绝对值。例如,+5的原码是00000101-5的原码是10000101
  • 反码:正数的反码与原码相同,负数的反码是在原码的基础上,符号位不变,其余位按位取反。例如,-5的反码是11111010
  • 补码:正数的补码与原码相同,负数的补码是在反码的基础上加1。在计算机中,整数通常以补码形式存储,这样可以方便地进行加减法运算。例如,-5的补码是11111011

二、 二进制转八进制

  • 方法:将二进制数从右到左每3位一组进行划分,不足3位的在左边补0。然后将每组二进制数转换为对应的八进制数。因为 2 3 = 8 2^3 = 8 23=8,所以每3位二进制数可以唯一地转换为1位八进制数。
  • 示例:将二进制数11010110转换为八进制。
    • 首先进行分组:011 010 110(在最左边补了一个0,凑成3位一组)。
    • 然后将每组转换为八进制:011转换为八进制是3,010转换为八进制是2,110转换为八进制是6。
    • 所以,二进制数11010110转换为八进制后是326
  • C语言中没有直接的二进制表示形式,但可以通过位操作来实现转换思路。假设已经有一个二进制数存储在一个int变量binary_num中,以下是一个简单的函数来转换为八进制(这里只是示意,实际情况可能更复杂):
#include 
void binaryToOctal(int binary_num) {
    int octal_num = 0;
    int place_value = 1;
    int temp = binary_num;
    while (temp) {
        octal_num += (temp % 8) * place_value;
        temp /= 8;
        place_value *= 10;
    }
    printf("八进制数: %d\n", octal_num);
}
int main() {
    int binary_num = 0b11010110;  // C99标准支持二进制字面量,这里假设编译器支持
    binaryToOctal(binary_num);
    return 0;
}
  • 解释:
    • binaryToOctal函数中,通过不断地取二进制数对8取余,并乘以相应的位权(从1开始,每次乘以10),将余数累加到octal_num中,最后得到八进制数。
    • main函数中,定义了一个二进制数(如果编译器不支持二进制字面量,可以通过位操作来设置二进制数),然后调用binaryToOctal函数进行转换。

三、 二进制转十六进制

  • 方法:将二进制数从右到左每4位一组进行划分,不足4位的在左边补0。然后将每组二进制数转换为对应的十六进制数。因为 2 4 = 16 2^4 = 16 24=16,所以每4位二进制数可以唯一地转换为1位十六进制数。十六进制数使用数字0 - 9和字母A - F来表示,其中A表示10,B表示11,C表示12,D表示13,E表示14,F表示15。
  • 示例:将二进制数11011010转换为十六进制。
    • 首先进行分组:1101 1010
    • 然后将每组转换为十六进制:1101转换为十六进制是D,1010转换为十六进制是A。
    • 所以,二进制数11011010转换为十六进制后是DA
  • 以下是一个简单的C语言函数来实现二进制转十六进制(同样是示意):
#include 
void binaryToHexadecimal(int binary_num) {
    int hexadecimal_num = 0;
    int place_value = 1;
    int temp = binary_num;
    while (temp) {
        hexadecimal_num += (temp % 16) * place_value;
        temp /= 16;
        place_value *= 10;
    }
    // 处理十六进制数的输出格式
    if (hexadecimal_num >= 10) {
        char hex_chars[] = {'A', 'B', 'C', 'D', 'E', 'F'};
        int hex_digit = hexadecimal_num % 10;
        if (hex_digit >= 10) {
            printf("十六进制数: %c\n", hex_chars[hex_digit - 10]);
        } else {
            printf("十六进制数: %d\n", hexadecimal_num);
        }
    } else {
        printf("十六进制数: %d\n", hexadecimal_num);
    }
}
int main() {
    int binary_num = 0b11011010;  // 假设编译器支持二进制字面量
    binaryToHexadecimal(binary_num);
    return 0;
}
  • 解释:
    • binaryToHexadecimal函数中,通过不断地取二进制数对16取余,并乘以相应的位权(从1开始,每次乘以10),将余数累加到hexadecimal_num中。
    • 对于输出部分,因为十六进制数可能包含字母,所以当hexadecimal_num大于等于10时,需要将数字转换为对应的字母(A - F)进行输出。
    • main函数中,定义了一个二进制数并调用binaryToHexadecimal函数进行转换。

你可能感兴趣的:(C语言学习,c语言,开发语言)