二进制与字节单位,以及各种定义变量的取值范围。
为什么是二进制?人类日常生活明明是十进制的,为何数字电子领域偏要选择二进制?这是由数字硬件电路决定的。人有十个手指头,人可以发出十种不同声音来命名0,1,2,3...9这些数字,人可以肉眼识别十种不同状态的信息,但是数字电路要直接处理十进制却很难,相对来说,二进制就轻松多了。一颗LED灯的亮与灭,一根IO口的输出是高电平和低电平,读取某一个点的电压是高于2V还是低于0.8V,只需要用三极管等元器件就可把处理电路搭建起来,二进制广泛应用在数字电路的存储,通讯和运算等领域,想学好单片机就必须掌握它。
二进制如何表示成千上万的数值?现在用LED灯的亮和灭来跟大家讲解。
(1)1个LED灯:
灭 第0种状态
亮 第1种状态
合计:共2种状态。
(2)2个LED灯挨着:
灭灭 第0种状态
灭亮 第1种状态
亮灭 第2种状态
亮亮 第3种状态
合计:共4种状态。
(3)3个LED灯挨着:
灭灭灭 第0种状态
灭灭亮 第1种状态
灭亮灭 第2种状态
灭亮亮 第3种状态
亮灭灭 第4种状态
亮灭亮 第5种状态
亮亮灭 第6种状态
亮亮亮 第7种状态
合计:共8种状态。
(4)8个LED灯挨着:
灭灭灭灭灭灭灭灭 第0种状态
灭灭灭灭灭灭灭亮 第1种状态
......
亮亮亮亮亮亮亮灭 第254种状态
亮亮亮亮亮亮亮亮 第255种状态
合计:共256种状态。
(5)16个LED灯挨着:
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭 第0种状态
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭亮 第1种状态
......
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮灭 第65534种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮 第65535种状态
合计:共65536种状态。
(6)32个LED灯挨着:
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭
第0种状态
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭亮
第1种状态
......
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮灭
第4294967294种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮
第4294967295种状态
合计:共4294967296种状态。
什么是位?以上一个LED灯就代表一位,8个LED灯就代表8位。一个变量的位数越大就意味着这个变量的取值范围越大。一个单片机的位数越多大,就说明这个单片机一次处理的数据范围就越大,意味着运算和处理速度就越快。我们日常所说的8位单片机,32位单片机,就是这个位的概念。为什么32位的单片机比8位单片机的处理和运算能力强,就是这个原因。位的英文名是用bit来表示。
什么是字节?字节是计算机很重要的一个基本单位,一个字节有8位。8个LED灯挨着能代表多少种状态,就意味着一个字节的数据范围有多大。从上面举的例子中,我们知道8个LED灯挨着,能表示从0到255种状态,所以一个字节的取值范围就是从0到255。
各种定义变量的取值范围。前面第十一节讲了常用变量的定义有3种,unsigned char,unsigned int ,unsigned long。但是没有讲到它们的取值范围,现在讲到二进制和字节了,可以回过头来跟大家讲讲这3种变量的取值范围,而且很重要。
unsigned char的变量占用1个字节RAM,共8位,根据前面LED灯的例子,取值范围是从0到255。
Unsigned int的变量占用2个字节RAM,共16位,根据前面LED灯的例子,取值范围是从0到65535。
Unsigned long的变量占用4个字节RAM,共32位,根据前面LED灯的例子,取值范围是从0到4294967295。
现在我们编写一个程序来验证unsigned char和unsigned int的取值范围。定义两个unsigned char变量a和b,a赋值255,b赋值256,255和256恰好处于unsigned char的取值边界。另外再定义两个unsigned int变量c和d,c赋值65535,d赋值65536,65535和65536恰好处于unsigned int的取值边界。最后把程序编译后下载到朱兆祺51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:
void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
unsigned char a; //定义一个变量a,并且分配了1个字节的RAM空间。
unsigned char b; //定义一个变量b,并且分配了1个字节的RAM空间。
unsigned int c; //定义一个变量c,并且分配了2个字节的RAM空间。
unsigned int d; //定义一个变量d,并且分配了2个字节的RAM空间。
a=255;//把255赋值给变量a,a此时会是什么数?会超范围溢出吗?
b=256;//把256赋值给变量b,b此时会是什么数?会超范围溢出吗?
c=65535;//把65535赋值给变量c,c此时会是什么数?会超范围溢出吗?
d=65536;//把65536赋值给变量d,d此时会是什么数?会超范围溢出吗?
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学习板观察程序执行的结果如下:
unsigned char变量a的数值是255。
unsigned char变量b的数值是0。
unsigned int 变量c的数值是65535。
unsigned int 变量d的数值是0。
通过以上现象分析,我们知道unsigned char变量最大能取值到255,如果非要赋值256就会超出范围溢出后变成了0。而unsigned int变量最大能取值到65535,如果非要赋值65536就会超出范围溢出后变成了0。
多说一句,至于unsigned long的取值范围,大家暂时不用尝试,因为我现在给大家用的模板程序能观察的最大变量是16位的unsigned int类型,暂时不支持32位的unsigned long类型。
下节预告:二进制与十六进制。转载
|