当前位置:首页 > 单片机 > 单片机
[导读]从业十年,教你单片机入门 第14讲:C51编译器并不支持二进制的书写格式,即使添加某个头文件后能支持二进制的书写格式,二进制的书写还是有个弊端,就是数字太多太长了,写起来非常费劲不方便,怎么办?解决办法就是用

从业十年,教你单片机入门 第14讲:

C51编译器并不支持二进制的书写格式,即使添加某个头文件后能支持二进制的书写格式,二进制的书写还是有个弊端,就是数字太多太长了,写起来非常费劲不方便,怎么办?解决办法就是用十六进制。十六进制是二进制的缩写,之所以称它为二进制的缩写,是因为它们的转换关系非常简单直观,不需要借助计算器即可相互转换。

何谓十六进制?欲搞清楚这个问题,还得先从十进制说起。所谓十进制,就是用一位字符可以表示从0到9这十个数字。所谓二进制,就是用一位字符可以表示从0到1这二个数字。所谓十六进制,当然也就是用一位字符可以表示从0到15这十六个数字。但是马上就会面临一个问题,十六进制的10到15这6个数其实是有两位字符组成的,并不是一位呀?于是C语言用一个字符A,B,C,D,E,F分别替代10,11,12,13,14,15这6个数,10前面的0到9还是跟十进制的字符一致。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,可以在左边补上2个0变成00101001,然后把每4位字符转成1个十六进制的字符。左边高4位0010对应十六进制的2,右边低4位1001对应十六进制的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学习板上观察十六进制和二进制?S1和S5按键是切换窗口按键。按住S9按键不松手,就可以观察当前窗口数据的十六进制格式了。松开S9按键就是当前窗口的十进制数据格式。而坚鸿51学习板右上角的16个LED灯就代表了当前窗口的二进制,亮的代表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=0x2C与d=44的含义是一样的。十六进制的0x2C和十进制的44最终都会被C51编译器翻译成二进制00101100。

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

语音识别技术,也被称为自动语音识别(Automatic Speech Recognition,ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。

关键字: 语音识别 按键 二进制

十六进制数是一种基数为16的计数系统,通常用数字0-9和字母A-F来表示。在计算机科学中,十六进制数被广泛应用于数据的表示和存储,因为它可以用较少的位数表示较大的数值,并且与二进制数有良好的对应关系。

关键字: 十六进制 十进制

触发器是数字逻辑电路中的基本元件,用于存储二进制状态。RS触发器是最早的触发器类型之一,由两个与门和一个或门构成。基本RS触发器具有置位、复位和保持功能,其特性方程是描述触发器输入与输出之间逻辑关系的数学表达式。

关键字: 触发器 数字逻辑电路 二进制

半加器虽然可以完成两个二进制位相加,但是它无法处理进位问题,因此不能用于加上多位数。为了解决这个问题,我们引入全加器。

关键字: 半加器 全加器 二进制

将“二进制”单独拿出来作为一节来讲,是因为它是一个极为基础的概念。但是很多人对二进制并没有形象的认识,甚至有一些已经入门、稍有开发经验的人对它的理解仍然比较模糊。所以振南认为有必要将它以一种更为形象、通俗而又深刻的方式着...

关键字: 二进制 单片机 CPU

二进制(binary),是在数学和数字电路中以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示。发现者是莱布尼茨。数字电子电路中,逻辑门的实现直接应用了...

关键字: 单片机 二进制 十六进制

Base64就是一种基于64个可打印字符来表示二进制数据的方法,网络上最常见的用于传输8Bit字节码的编码方式之一。

关键字: Base64 64 二进制

计算机网络编程中一个非常基本的问题:该怎样表示client与server之间交互的数据,在往下看之前先想一想这个问题。

关键字: 计算机 二进制

外部数据总线是中央处理器CPU(Central Processing Unit)的一部分,是CPU与外部数据传输的通道。外部数据总线一次可传输二进制数据的位数越大,CPU与外部交换数据的能力越强。

关键字: 外部数据线 CPU 二进制

今天,我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思。具体的题目如下:文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G.这个题目的意思应该很清楚了,比较直白。为了...

关键字: 腾讯 BITMAP UNSIGNED 内存
关闭
关闭