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

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:436
  • 最近打卡:2025-05-03 09:53:06
已绑定手机

229

主题

328

回帖

1479

积分

金牌会员

积分
1479
发表于 2023-1-14 11:06:54 | 显示全部楼层
加不加无所谓,
  • 打卡等级:偶尔看看III
  • 打卡总天数:52
  • 最近打卡:2025-05-03 23:41:15

73

主题

5884

回帖

1万

积分

超级版主

积分
12085
发表于 2023-1-14 13:38:18 | 显示全部楼层
KEIL的常数默认是16位的,不指定,则超过16位的就会截断成16位的。
给32位变量给立即数,超过65535的,一定要加L或UL。可以参考STC的例子,十几年前的例子都是是这样处理的了,最经典的是定义主频。
  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-30 20:21:43

9

主题

62

回帖

697

积分

高级会员

积分
697
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:52
  • 最近打卡:2025-05-03 23:41:15

73

主题

5884

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-30 20:21:43

9

主题

62

回帖

697

积分

高级会员

积分
697
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:52
  • 最近打卡:2025-05-03 23:41:15

73

主题

5884

回帖

1万

积分

超级版主

积分
12085
发表于 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;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-30 20:21:43

9

主题

62

回帖

697

积分

高级会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-4 01:18 , Processed in 0.151332 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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