C高阶:进制

1. 进制

百度百科:
进制也就是进位计数制,是人为定义的带进位的计数方法,对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制是逢二进一,以此类推,x进制就是逢x进位。

  • 基数与权

基数是计数值制所用到的数字符号的个数,在基数为R的计数制中包含0 1 2...R-1,共R个数字符号。进位规律是逢R进一,称为R进制位权是指在一种进位计数制表示的数中,用来表示不同数位上数值的大小的一个固定常数,不同的数位有不同的位权,某一个数位的数值等于这一位的数字符号乘上该数的位权。例如:

2. 转换

十进制转换成R进制用短除法,电脑的计算器通常具有进制转化功能。

3. 运算

No. 进制 数码 进位条件
1 二进制 01 逢二进一
2 八进制 01234567 逢八进一
3 十进制 0123456789 逢十进一
4 十六进制 0123456789ABCDEF 逢十六进一

ASCII码就是被普遍采用的一个英文字符信息编码方案,它用8位二进制数表示各种字母和符号

  1. 人类为什么使用十进制?

  2. 计算机为什么使用二进制、八进制、十六进制?

    1. 实现容易:电路中的状态容易表示01(开与关、亮与灭、高与低)。
    2. 可靠性高:01两个数字传输和处理不易出错。
    3. 运算简单:与十进制数相比,二进制数的运算规则要简单。
    4. 适合逻辑:01与逻辑代数中的真和假相吻合。
    5. 易于转换:二进制与十进制数易于互相转换。

    由于二进制数据的基数较小,所以二进制数据的书写和阅读不方便。
    每个数码正好对应三位二进制数,所以八进制能很好地反映二进制。
    由于二进制数在使用中位数太长,不容易记忆,所以又提出了十六进制数。

  1. 其他进制(7进制、60进制、24进制、30进制、365进制)
  2. 小数有二进制吗?

中国古代的十六进制?--半斤八两



《系辞》:是故易有太极,是生两仪,两仪生四象,四象生八卦。


4. C语言中的进制

4.1 进制常量表示

C语言不能直接表示二进制常量。八进制数字以0开头,十六进制数字以0x0X开头。

十进制 八进制 十六进制 十进制 八进制 十六进制
0 0 0 16 020 0x10
1 01 0x1 17 021 0x11
2 02 0x2 18 022 0x12
3 03 0x3 19 023 0x13
4 04 0x4 20 024 0x14
5 05 0x5 21 025 0x15
6 06 0x6 22 026 0x16
7 07 0x7 23 027 0x17
8 010 0x8 24 030 0x18
9 011 0x9 25 031 0x19
10 012 0xa 26 032 0x1a
11 013 0xb 27 033 0x1b
12 014 0xc 28 034 0x1c
13 015 0xd 29 035 0x1d
14 016 0xe 30 036 0x1e
15 017 0xf 31 037 0x1f
  • 试一试
    int a = 08;
    int b = 09;
    printf("%o%o",a,b);
    

4.2 输入输入

4.2.1 进制打印

打印32以内的十进制、八进制、十六进制对应表。

for(int i=0;i<32;++i){
    printf("%d\t%#o\t%#x\n",i,i,i);
}

进制的输出其实与字符输出是一样的,根据占位符的不同输出不同。

char a = 'a';
printf("%c\t%d\t%#o\t%#x\n",a,a,a);

4.2.1 输入进制数据

int n;
scanf("%o",&n);
printf("%d\n",n);
scanf("%x",&n);
printf("%d\n",n);
scanf("%d",&n);
printf("%d\n",n);
scanf("%i",&n);
printf("%d\n",n);

练习

进制转换器

你可能感兴趣的:(C高阶:进制)