【一起来学C语言】常用进制的转换与应用(下)

时间:2024-03-23 07:54:17

【前言】

      上篇博客说到常用进制的转换,这里需要补充的是C语言支持三种数制,十进制、八进制、十六进制,并不支持二进制。因为C语言是一门高级语言,支持的是用户习惯的十六、八、十进制,二进制用于机器语言和汇编语言。
      二进制与八进制、十进制、十六进制之间的转换你有没有get到呢?get到了,你也许会问,这些进制有什么用啊?学以致用嘛,所以本篇博客来拿具体的例子来介绍下进制的应用。希望会对读者有所帮助。

【数制应用】

1.ASCII码

      我们都知道计算机采用的是二进制的存储,键盘上每一个符号都有自己的二进制编码。
      ASCII码是由美国American制定的标准Standard码Code用于信息Information交换Inchange。
      A的二进制编码是1000001,但是我们习惯看十进制的编码,所以转换为十进制,A的十进制编码就是65。B十进制66,a的十进制是97,b的十进制是98。

      所以我们的ASCII码就用到了二进制,因为计算机存储,输入输出使用的均为二进制。


                               【一起来学C语言】常用进制的转换与应用(下)


2.内存

       内存的知识在C语言中是比较重要的一个知识点。内存是由若干存储单元构成 ,每个存储单元像房间一样,都可以存放一个内容值,且每个内存单元存放值的大小是固定大小,一个字节8位。
。内存地址是一维的线性,内存中有两种值,一种是内容值,一种是地址值。每个存储单元都有唯一的地址来标识内存的房间,通过地址来访问内容值,
      我们对内存只有两类操作,不是读就是写,写操作会改变内存单元的内容值。内存在计算机关机后信息就消失了。

内存单位:

位 bit 
字节Byte
8位=1字节
1024字节=1KB
1K=1024=2的10次方字节
1M=1024KB=1024*1024=2的20次方字节
1024M=1GB=2的30次方字节
1024GB=1TB=2的40次方字节

      地址和内容值都是二进制,地址必须是唯一,3位地址可以存放8个存储单元,2位地址可以存放4个内存储单元。
      所以内存的大小是由地址的位数决定的,地址位数越大,存储容量也就大了。看看下面的小例子,还会帮助你理解
      如果我要存储16个内存单元,需要多少位二进制呢?2的4次方,所以4位二进制有16种地址。
      如果要存储1M的内存,需要多少位呢?看看上面的内存单位,1M是2的20次方,所以内存地址需要20位。也就是从20个0到20个1那么多种存储地址,可以放入2的20次方也就是1M的内存内容值。
                             

3.机器码

      存到计算机中的二进制我们叫做机器码,机器码又分三种,分别是原码、反码和补码。
      我们写的10进制的如66,88叫做真值,如果把真值转换为机器码中的原码,就是把十进制转为二进制。
       

4.地址映射

例题:
==========================================
1.16位的逻辑地址,逻辑地址空间是多大?物理内存32K,地址多少位?

逻辑地址就是我们上面说的地址,逻辑地址空间就是我们说的内存。
所以2的16次方等于 2的6次方=64,乘2的10次方=K,最后结果就是64K

同理,物理内存32K,转换为地址的位数。我们知道32=2的5次方,K=2的10次方,所以10+5一共15位。

==========================================
2.假设逻辑地址32位,页面大小4K,逻辑地址分成多少个页面?

逻辑地址空间为 2的32 次方,一个页面 4K=2的12次方。内存除以页面大小,得20,就是20个页面。

=========================================
3.4个2K内存芯片,每个2K存储空间起始地址是多少?

2K是地址空间,我们是要求地址空间所占的位数。
2是2的1次方,K是2的10次方,所以2K需要11位存储地址。
用2进制来表示,位数过长,我们需要转换为十六进制。
二进制转换十六进制,需要4位二进制压缩为一位十六进制,位数不够需要最高位补零。

所以第一个2K转化为十六进制
起:000…0 (16个0) --- 0000H
终:111…1(16个1)---  07FFH 

第二个2K转换为十六进制

  07FF
+   1
=0800 H  起

 0800
+07FF
=0FFF 终

第三个2K转换为十六进制

 0FFF
+   1
=1000 H 起

  1000
+07FF
=17FF 终

第四个2K转换为十六进制

 17FF
+   1
=1800  起

 1800
+07FF
=1FFF 终

5.IP地址  地址位数决定容量大小

例题
==========================================
1.某主机IP地址为180.80.77.55,子网掩码为255.255.252.0,问主机号部分多少位?

Tips:IPV4地址是32位,对应二进制1的是网络号,对应二进制0的位数是主机号的位数

把子网掩码转换为2进制。
255 、252 是10进制,转换为2进制。
除二取余倒排,255转化为二进制为1111 1111 ,252转化为1111 1100。 0转换为8位0
原子网掩码转化为二进制为 1111 1111 .1111 1111.1111 1100.0000 0000 一共10位0,主机号就是10位。

==========================================
2.求IP分组到达时,经过多少个路由器?
Tips:两个十六进制的差
如40H-31H,十六进制借一当做十六用,所以,最后结果应该是16-1=0FH=15个
 

【小结】

      对于常用进制的转换和应用就简介到这里,以后有学习总结在继续补充到博客中。