打印

关于KEIL下大常量后加L的问题

[复制链接]
4334|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xait3207|  楼主 | 2009-1-5 10:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   近日做射频系统,一个简单的MCU系统,程序全部用C语言设计,开发环境为盗版的Keil,用到定时器定义一个60秒的时间时,如此定义:
uint16  time;   //16位变量
/*初始化 */
time = 60*1000/TMRCYC     //TMRCYC=5,定时器中断间隔为5ms
                          //time总时间60s
实际运行时,60s定时总是感觉不到,也就是说60s根本就没定义成功。
理论上讲,time =12000,比16位最大值65535小,应该没问题,但实际就是不行,以前没怎么用过Keil,所以也没注意这个问题,是否其他编译器也有这个问题不得而知,最后,定义改为:
time = 60*1000L/TMRCYC   //常量1000后加L
问题解决。
但仍未完全明白其中道理,难道是编译器的问题,在此抛砖引玉,鄙人虽说也有几年程序经验,但哎,偏偏这么一个看似基础性的东西却不懂, 希望有大虾们解释下,可能对你们来说问题很简单,但不懂或没有遇见的小菜们却是有千千万万,你们就权当做好事了。 

相关帖子

沙发
zyok| | 2009-1-5 10:57 | 只看该作者
板凳
xait3207|  楼主 | 2009-1-5 11:08 | 只看该作者

匠人的解答

因为C51的编译器默然的整型为16位,所以对于小于32768的数就会认为是整型,做16位的运算,
对于运算结果超出16位的,就被截断了。如果运算结果最高位为1的,还要进行符号扩展,例如
如果你写的是j=20000*2;,结果就是0xFFFF9C40了。对于大于等于32768的数,就会先自动扩展为
long int型,然后再运算,这时结果就不会出错了,就像你程序中后三个结果一样。
为了安全起见,不管它多大,还是明确指定为好:
  j = 20000L*4;
  j = 20000L*4;
  j = 65535L*4;
  j = 65535L*4;
如果你换成keil CARM,就不会存在这个问题了,因为ARM是32位的,int就是32位的。

使用特权

评论回复
地板
xait3207|  楼主 | 2009-1-5 11:08 | 只看该作者

上面那是圈圈的解答

使用特权

评论回复
5
gezhi| | 2009-1-5 11:37 | 只看该作者

数据运算过程中的中间变量的问题

系统会立即数1000放入int类型的内存中,当这个立即数参与long型运算时,所开辟的内存就溢出了。后面加个L的意思是将这个立即数存入long型的内存单元参与后面的运算。
大概意思就是这样,希望对你有帮助。

使用特权

评论回复
6
奇门遁甲| | 2009-1-5 12:20 | 只看该作者

re

应该加 "ul".

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

17

帖子

0

粉丝