找回密码
 立即注册
查看: 859|回复: 8

怎样正确对 Keil长整数(long)赋值~~~

[复制链接]
  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 144 天

    [LV.7]常住居民III

    38

    主题

    874

    回帖

    4025

    积分

    荣誉版主

    积分
    4025
    发表于 2023-1-13 08:15:15 | 显示全部楼层 |阅读模式
    关于如何对 Keil长整数(long)正确赋值,这个问题

    别说新鸟,有些老司机也会犯错!

    这里再次强调,Keil长整数(long)赋值 结尾 必须加 L

    否则 Keil 内部作整数(int)处理

    经典实例,见以下的 STC 主时钟定义

    #define MAIN_Fosc                22118400L        //定义主时钟
    //#define MAIN_Fosc                12000000L        //定义主时钟
    //#define MAIN_Fosc                11059200L        //定义主时钟
    //#define MAIN_Fosc                 5529600L        //定义主时钟
    //#define MAIN_Fosc                24000000L        //定义主时钟

    回复 送花

    使用道具 举报

    该用户从未签到

    2

    主题

    4

    回帖

    28

    积分

    新手上路

    积分
    28
    发表于 2023-1-14 09:41:47 | 显示全部楼层
    是的,还有预处理有计算时也一样,计算有超过2字节的也要做处理。写了个320*240/1000。结果算不对。要改320L*240L/1000
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 06:42
  • 签到天数: 161 天

    [LV.7]常住居民III

    150

    主题

    212

    回帖

    1760

    积分

    金牌会员

    积分
    1760
    发表于 2023-1-14 11:06:54 | 显示全部楼层
    加不加无所谓,

    该用户从未签到

    46

    主题

    3006

    回帖

    6777

    积分

    超级版主

    积分
    6777
    发表于 2023-1-14 13:38:18 | 显示全部楼层
    KEIL的常数默认是16位的,不指定,则超过16位的就会截断成16位的。
    给32位变量给立即数,超过65535的,一定要加L或UL。可以参考STC的例子,十几年前的例子都是是这样处理的了,最经典的是定义主频。
  • TA的每日心情
    慵懒
    2024-5-2 11:18
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    7

    主题

    46

    回帖

    387

    积分

    中级会员

    积分
    387
    发表于 2023-7-29 21:11:01 | 显示全部楼层
    梁工 发表于 2023-1-14 13:38
    KEIL的常数默认是16位的,不指定,则超过16位的就会截断成16位的。
    给32位变量给立即数,超过65535的,一定 ...

    梁工,问一下 如果是
    long   a,a1,a2;
    a = adc(2);  //读取ADC
    a1 = a *567;   //a1 肯定是大于65535的数  
    a2 = a1 *789;//这个a1应该如何处理

    点评

    还没有溢出,不需要做什么处理。  详情 回复 发表于 2023-7-29 23:12
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3006

    回帖

    6777

    积分

    超级版主

    积分
    6777
    发表于 2023-7-29 23:12:20 | 显示全部楼层
    琪琪鸭 发表于 2023-7-29 21:11
    梁工,问一下 如果是
    long   a,a1,a2;
    a = adc(2);  //读取ADC

    还没有溢出,不需要做什么处理。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-5-2 11:18
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    7

    主题

    46

    回帖

    387

    积分

    中级会员

    积分
    387
    发表于 2023-7-31 21:17:10 | 显示全部楼层
    梁工 发表于 2023-7-29 23:12
    还没有溢出,不需要做什么处理。

    找到问题了
    unsigned int a,a1;
    unsigned long a2;

    a2 = a * a1;
    其实这是我想问的   上面的这个算法绝对的完犊子。。

    点评

    a * a1溢出了。应该写成: a2 = (unsigned long)a * a1;  详情 回复 发表于 2023-7-31 23:51
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3006

    回帖

    6777

    积分

    超级版主

    积分
    6777
    发表于 2023-7-31 23:51:33 | 显示全部楼层
    琪琪鸭 发表于 2023-7-31 21:17
    找到问题了
    unsigned int a,a1;
    unsigned long a2;

    a * a1溢出了。应该写成:
    a2 = (unsigned long)a * a1;
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-5-2 11:18
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    7

    主题

    46

    回帖

    387

    积分

    中级会员

    积分
    387
    发表于 2023-8-1 22:13:24 | 显示全部楼层
    梁工 发表于 2023-7-31 23:51
    a * a1溢出了。应该写成:
    a2 = (unsigned long)a * a1;

    好的梁工  谢谢解答
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-15 07:25 , Processed in 0.067217 second(s), 61 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表