C语言进制转换问题

1.进制

为什么要使用二进制、八进制、十进制、十六进制?

  • 因为现在的CPU只能识别高低电平,只能对二进制的数据进行计算

  • 虽然二进制的数据可以直接被CPU识别计算,但是不方便书写和记录,把二进制的数据转换成八进制是为了方便记录到文档中

  • 由于CPU的位数的发展不断增加,由早期的8位逐渐发展到现在的64位,因此8进制逐渐不能满足需求,所以发展出了十六进制

但是由于历史原因八进制还不能完全淘汰

十进制转二进制:

(还能转其他进制)求余法:用2对数据求余,然后继续对商求余,直到商为0结束,该过程中产生的余数结果就是该数据的二进制(逆序)

n%2 == 1\0

商%2 == 1\0

……

直到商为0

余数的逆序就是n的二进制

求权法:从高位到低位,数据 - 2^(n-1) 如果够减,那么第n位就是1,否则就是0,直到把数据减为0

128 64 32 16 8 4 2 1

86 72 112 176

1010110 1001000 1110000 10110000

练习1:输入一个正整数m,输入n(n>=2),显示m的n进制数,超过10的用字母表示

#include

int main(int argc,const char* argv[])
{
    int m = 0,n = 0,cnt = 0;
    printf("请输入m n的值:");
    scanf("%d%d",&m,&n);

    char bits[32] = {};      // 定义一个32位的数组
    while(m)
    {
        bits[cnt++] = m%n;   //将余数存入数组
        m /= n;
    }

    for(int i=cnt-1; i>=0; i--) // 逆向输出数组的值
    {
        if(bits[i] < 10)
        {
            printf("%hhd",bits[i]);    
        }
        else
        {
            printf("%c",'A'+bits[i]-10);    //如果大于等于10,则用大写字母来表示
        }
    }
}

二进制转十进制: (其他进制转十进制)

每位的2^(n-1) 求和

二进制转八进制:

从低位开始,每三位二进制位对应一位八进制

二进制转十六进制:

从低位开始,每四位二进制位对应一位十六进制

在C语言中,以0开头的数是八进制数,以0x开头的数是十六进制

%o 以8进制显示数据

%x 以16进制显示数据

%#o %#x 把数据对应的前缀显示出来

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