搜索
查看: 960|回复: 1

第十四节:二进制与十六进制。

[复制链接]

52

主题

146

帖子

380

积分

中级会员

Rank: 3Rank: 3

积分
380
发表于 2015-7-21 11:18:43 | 显示全部楼层 |阅读模式
C51编译器并不支持二进制的书写格式,即使添加某个头文件后能支持二进制的书写格式,二进制的书写还是有个弊端,就是数字太多太长了,写起来非常费劲不方便,怎么办?解决办法就是用十六进制。十六进制是二进制的缩写,之所以称它为二进制的缩写,是因为它们的转换关系非常简单直观,不需要借助计算器即可相互转换。

       何谓十六进制?欲搞清楚这个问题,还得先从十进制说起。所谓十进制,就是用一位字符可以表示从09这十个数字。所谓二进制,就是用一位字符可以表示从01这二个数字。所谓十六进制,当然也就是用一位字符可以表示从015这十六个数字。但是马上就会面临一个问题,十六进制的10156个数其实是有两位字符组成的,并不是一位呀?于是C语言用一个字符A,B,C,D,E,F分别替代10,11,12,13,14,156个数,10前面的09还是跟十进制的字符一致。A,B,C,D,E,F也可以用小写a,b,c,d,e,f来替代,不区分大小写。

       前面提到了十六进制是二进制的缩写,它们的转换关系非常简单直观,每1位十六进制的字符,对应4位二进制的字符。关系如下:
十进制       二进制      十六进制
0               0000        0
1               0001        1
2               0010        2
3               0011        3
4               0100        4
5               0101        5
6               0110        6
7               0111        7
8              1000        8
9              1001        9
10            1010        A
11            1011        B
12            1100        C
13            1101        D
14            1110        E
15            1111        F

       二进制转换成十六进制的时候,如果不是4位的倍数,则最左边高位默认补上0凑合成4位的倍数。比如二进制101001,可以在左边补上20变成00101001,然后把每4位字符转成1个十六进制的字符。左边高40010对应十六进制的2,右边低41001对应十六进制的9,所以合起来最终的十六进制是29
       十六进制的标准书写格式。刚才提到的十六进制29,在C语言里不能直接写29,否则就跟十进制的写法混淆了。为了把十六进制和十进制的书写格式进行区分,C语言规定凡是十六进制必须加一个数字0和一个字母x作为前缀,也就是十六进制必须以0x作为前缀,刚才的十六进制29就应该写成0x29。凡是不加前缀的就默认为十进制。
       现在我们编写一个程序来观察十六进制和二进制的关系,最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:

  • void main() //主程序
  • {
  • /*---C语言学习区域的开始---------------------------------------------------------------------------*/
  •   unsigned char a;    //定义一个变量a,并且分配了1个字节的RAM空间。
  •   unsigned char b;    //定义一个变量b,并且分配了1个字节的RAM空间。
  •   unsigned char c;    //定义一个变量c,并且分配了1个字节的RAM空间。
  •   unsigned char d;    //定义一个变量d,并且分配了1个字节的RAM空间。
  •   a=0x06;   //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
  •   b=0x0A;   //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
  •   c=0x0e;   //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
  •   d=0x2C;   //十六进制前记得加0x前缀,超过9部分的字母不分大小写。
  •   GuiWdData0=a;   //把变量a这个数值放到窗口变量0里面显示
  •   GuiWdData1=b;   //把变量b这个数值放到窗口变量1里面显示
  •   GuiWdData2=c;   //把变量c这个数值放到窗口变量2里面显示
  •   GuiWdData3=d;   //把变量d这个数值放到窗口变量3里面显示
  • /*---C语言学习区域的结束---------------------------------------------------------------------------*/
  •    while(1)
  •    {
  •       initial();
  •       key_service();
  •       display_service();
  •    }
  • }


复制代码


        如何在坚鸿51学习板上观察十六进制和二进制?S1S5按键是切换窗口按键。按住S9按键不松手,就可以观察当前窗口数据的十六进制格式了。松开S9按键就是当前窗口的十进制数据格式。而坚鸿51学习板右上角的16LED灯就代表了当前窗口的二进制,亮的代表1,灭的代表0
       上朱兆祺51学习板观察程序执行的结果如下:
                                   十六进制         二进制         十进制     
unsigned char变量a      6                     0000 0110       6
unsigned char变量b      A                    0000 1010       10
unsigned char变量c      E                    0000 1110       14
unsigned char变量d      2C                  0010 1100       44

       多说一句,在程序里,可以用十六进制,也可以用十进制,比如:
d=0x2Cd=44的含义是一样的。十六进制的0x2C和十进制的44最终都会被C51编译器翻译成二进制00101100

       下节预告:十进制与十六进制。

回复

使用道具 举报

84

主题

601

帖子

1903

积分

金牌会员

Rank: 6Rank: 6

积分
1903
发表于 2015-7-21 13:32:56 | 显示全部楼层
看着很不错的样子
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

Archiver|手机版|小黑屋|RF技术社区

GMT+8, 2024-4-16 22:45 , Processed in 0.076185 second(s), 10 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表