关于keil编译51单片机(1<<16)运…

来源:互联网 发布:c语言 ip地址 合法性 编辑:程序博客网 时间:2024/06/15 20:33
#include<reg52.h>

//#define TL(x) ((1<<16) - x) %256;
//#define TH(x) ((1<<16) - x) /256;
#define uint unsigned int
int main( void )
{
  uint  a;
a = (65536 - 250) / 256;  //这里1
        a= ((1<<16) - 250) /256; //还有这里2
return 0;
}

如上程序:
1输出结果正确
2输出结果为0
原因分析(不确定):
反汇编中1存入a中的值正确
2中存入a中的值为0
对于2,keil编译器默认常数1为16位(int),当执行1<<16时便溢出,实际上变成了0.(以前看过用这个方法测量机器是几位的),如果改为(long)1<<16,则执行结果正确。
编译器将65536看为long型,与1<<16有实质上的区别,所以在51上(8位单片机,int为16位)不能等同。只要左边的表达式能放下65536便不会溢出(uint不能,要用long或以上)。
实际上初始化定时器的值应该是65535,而不是65536
0 0
原创粉丝点击