美文网首页C/C++学习
C语言入门基础之进制转换

C语言入门基础之进制转换

作者: 牛顿学计算机 | 来源:发表于2021-05-27 08:27 被阅读0次

    在C语言中除了可以使用十进制外还可以用二进制、八进制和十六进制,各进制之间可互相转换。一个数默认是十进制,不需要特殊表示,但是二进制、八进制和十六进制就不一样了,他们都需要特殊表示。

    二进制

    二进制是由0和1组成,在C语言中使用二进制必须用0b或者0B开头,后面跟着若干0和1。

    int data = 0b00000001; //二进制1,data = 2^0 = 1
    int data2 = 0B00000011; //二进制3, data2 = 2^0 + 2^1 = 3
    int data3 = 0b00000111; //二进制7, data3 = 1 + 2^1 + 2^2 = 7
    int data4 = 0b00010110; //二进制22,data4 = 0 + 2^1 + 2^2 + 0 + 2^4 = 22
    

    那么二进制的数值如何与十进制对应呢?在C语言中int型占用4个字节,从字节的最低位到最高位,第i位为1表示2^(i - 1),否则为0,把所有对应位为1的值相加则是最终十进制的数值。

    八进制

    八进制的每一位数值范围是0~7,在C语言里数字0开头表示八进制。

    int num1 = 011; //八进制9,num1 = 1 * 8^0 + 1 * 8^1 = 9
    int num2 = 02; //八进制2, num2 = 2 * 8^0 = 2
    int num3 = 0101; //八进制85,num3 = 1 * 8^0 + 0 + 1 * 8^2 = 85
    

    在八进制里,某一位的系数是n,则某一位表示十进制的数值大小是:n * 8^(i - 1),其中i表示八进制里的第i位。最终变量十进制的值则是所有对应位是1的数值相加。

    十六进制

    十六进制每一位的数值大小是0~15,在C语言里十六进制使用0x或者0X作为开头。十六进制里某位系数大小超过十进制数值9则用A、B、C、D、E、F或者a、b、c、d、e、f表示。A、B、C、D、E、F或者a、b、c、d、e、f分别代表10、11、12、13、14、15。

    int m1 = 0x05; //十六进制5, m1 = 5 * 16 ^ 0 = 5
    int m2 = 0X21; //十六进制33, m2 = 1 + 2 * 16^1 = 33
    

    在十六进制里某一位的系数是n,则该位表示的十进制数值大小是n * 16^(i - 1),其中i表示十六进制里的第i位。最终变量的十进制值则是所有对应位是1的数值相加。

    总结

    一个数转换成对应进制后的基数是b(二进制b=2,八进制b=8,十六进制b=16,十进制b=10)有n位数,第i位系数是ai,则对应的十进制数值为a1 * b^(1 - 1) + a2 * b^(2 - 1) + a3 * b^(3 - 1) + ... + ai * b^(i - 1) + ... + an * b^(n - 1)。

    完整源代码

    #include <stdio.h>
    
    int main()
    {
        printf("Hello World!\n");
    
        int data = 0b00000001; //二进制1,data = 2^0 = 1
        int data2 = 0B00000011; //二进制3, data2 = 2^0 + 2^1 = 3
        int data3 = 0b00000111; //二进制7, data3 = 2^0 + 2^1 + 2^2 = 7
        int data4 = 0b00010110; //二进制22,data4 = 0 + 2^1 + 2^2 + 0 + 2^4 = 22
    
        int num1 = 011; //八进制9,num1 = 1 * 8^0 + 1 * 8^1 = 9
        int num2 = 02; //八进制2, num2 = 2 * 8^0 = 2
        int num3 = 0101; //八进制85,num3 = 1 * 8^0 + 0 + 1 * 8^2 = 85
    
        int m1 = 0x05; //十六进制5, m1 = 5 * 16 ^ 0 = 5
        int m2 = 0X21; //十六进制33, m2 = 1 + 2 * 16^1 = 33
    
        printf("二进制,data = %d, data2 = %d, data3 = %d, data4 = %d\n", data, data2, data3, data4);
        printf("八进制,num1 = %d, num2 = %d, num3 = %d\n", num1, num2, num3);
        printf("十六进制,m1 = %d, m2 = %d\n", m1, m2);
    
        return 0;
    }
    

    编译运行结果如下:

    Hello World!
    二进制,data = 1, data2 = 3, data3 = 7, data4 = 22
    八进制,num1 = 9, num2 = 2, num3 = 65
    十六进制,m1 = 5, m2 = 33
    

    相关文章

      网友评论

        本文标题:C语言入门基础之进制转换

        本文链接:https://www.haomeiwen.com/subject/mqrrsltx.html