单片机C语言编程,从而了解int的坑~~
问题展示
博主最近因对期末考试,其中有一门是单片机要在AT89C51上编程,需要显示学号后八位。
但是在仿真电路图先显示上却有了问题,详见如图:
Proteus:
keil:C语言
#include <REG52.H>
unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char bits[] = {0x01,0x02,0x04,0x08,0x10,0x20};
// 修改对应的Num即可
int num = 524304;
void delay(){
int i=300;
while(i--);
}
void main(void){
while(1){
int temp = num;
int i= 5;
while(i>=0){
P2 = bits[i];
P0 = seven_seg[temp%10];
temp=temp/10;
i--;
delay();
}
}
}
可以见到,当我的数据是524304
的时候,显示的是有问题的。之后我讲此数值改为一个较小的数1002
,则显示正确。
问题原因
因为此单片机是16位机,其长度不可能达到32位或是64位开发的int数值的存储长度。
在这里我利用了自己以前编写java和c语言的经验去开发,结果遇到了这个问题。
我们只要将int的长度控制到-32768到+32768之间
,才可以,但是如果是必须要存储,就需要自己构造对应的应用结构。比如数组,字符判断等方式。
结论
- 控制int长度
- 以后开发要关注代码的平台差异性(重点)
本次的差异其实动动脑子就可以了,平时开发的时候一直都能看到代码差异的问题。通过这次一个数值上的小问题,希望可以引起大家的思考,对自己进行反思。