从业十年,教你单片机入门 第18讲:
我前面介绍的三种数据类型unsigned char ,unsigned int ,unsigned long,都是有最大规模约束的,它们最大规模分别是255,65535,4294967295,假如加法运算的成果超过了参加运算的变量自身,会呈现什么成果,有什么规则,这便是本节要解说的溢出问题。
(1)何谓溢出?比方以下比如:
unsigned char a;
a=0x8536;
剖析:
因为a是unsigned char变量,位数是8位,也便是1个字节,而0x8536是16位,2个字节,这种情况下,把0x8536赋值给单字节变量a,变量a只能接收到最低位的一个字节0x36,而高位字节的0x85就被丢掉了,这个便是本节所说的“溢出”了。
(2)再看一个比如如下:
unsigned char b=0xff;
b=b+1;
剖析:
b默认值是0xff,再加1后,变成了0x0100保存在一个躲藏的中心变量,然后再把这个中心变量赋值给单字节变量b,b只能接收到低位字节0x00,所以运算后b的数值因为溢出变成了0x00。
(3)再看一个比如如下:
unsigned char c=0xff;
c=c+2;
剖析:
c默认值是0xff,再加2后,变成了0x0101保存在一个躲藏中心变量,然后再把这个中心变量赋值给单字节变量c,c只能接收到低位字节0x01,所以运算后c的数值因为溢出变成了0x01。
(4)再看一个比如如下:
Unsigned int d=0xfffe;
d=d+5;
剖析:
d默认值是0xfffe,再加5后,变成了0x10003保存在一个躲藏中心变量,因为这个躲藏的中心变量是unsigned int类型,只能保存2个字节的数据,所以在中心变量这个环节就溢出了,实践上躲藏的中心变量只保存了0x0003,然后再把这个中心变量赋值给双字节变量d,d天经地义也是0x0003。
(5)再看一个比如如下:
unsigned long e=0xfffffffe;
e=e+5;
剖析:
e默认值是0xfffffffe,再加5后,变成了0x100000003保存在一个躲藏中心变量,因为这个躲藏的中心变量是unsigned long类型,只能保存4个字节的数据,所以在中心变量这个环节就溢出了,实践上躲藏的中心变量只保存了0x00000003,然后再把这个中心变量赋值给4字节变量e,e天经地义也是0x00000003。
现在编写一个程序来操练上述前面4个比如,最终把程序编译后下载到坚鸿51学习板调查成果。请直接仿制第十节模板程序,修正的main程序代码如下:
void main() //主程序
{
/*—C言语学习区域的开端—————————————————————————*/
unsigned char a;
unsigned char b=0xff;
unsigned char c=0xff;
unsigned int d=0xfffe;
a=0x8536;
b=b+1;
c=c+2;
d=d+5;
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学习板上调查a,b,c,d这4个变量的十六进制?按下S1或许S5按键即可切换显现不同的窗口,然后显现不同的变量,只需按住S9按键不放,此刻显现的便是该变量的十六进制。上坚鸿51学习板调查程序履行的成果如下:
变量a为0x36。
变量b为0x00。
变量c为0x01。
变量d为0x0003。
这一节提到了一个“躲藏中心变量”的概念,这个奥秘的“躲藏中心变量”到底是unsigned int类型仍是unsigned long类型?有什么规则?假如运算中存在多种不同变量类型该怎么办,实践使用中有处理的方法吗?预知概况,请看一节内容。
下节预告:加法运算中,奥秘中心变量的类型以及处理“掺杂多种变量类型”的方法。