LAOXU 发表于 2023-1-13 08:15:15

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

关于如何对 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        //定义主时钟

pdwdzz 发表于 2023-1-14 09:41:47

是的,还有预处理有计算时也一样,计算有超过2字节的也要做处理。写了个320*240/1000。结果算不对。要改320L*240L/1000

QQ624353765 发表于 2023-1-14 11:06:54

加不加无所谓,

梁工 发表于 2023-1-14 13:38:18

KEIL的常数默认是16位的,不指定,则超过16位的就会截断成16位的。
给32位变量给立即数,超过65535的,一定要加L或UL。可以参考STC的例子,十几年前的例子都是是这样处理的了,最经典的是定义主频。

琪琪鸭 发表于 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:20

琪琪鸭 发表于 2023-7-29 21:11
梁工,问一下 如果是
long   a,a1,a2;
a = adc(2);//读取ADC


还没有溢出,不需要做什么处理。

琪琪鸭 发表于 2023-7-31 21:17:10

梁工 发表于 2023-7-29 23:12
还没有溢出,不需要做什么处理。

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

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

梁工 发表于 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;

琪琪鸭 发表于 2023-8-1 22:13:24

梁工 发表于 2023-7-31 23:51
a * a1溢出了。应该写成:
a2 = (unsigned long)a * a1;

好的梁工谢谢解答
页: [1]
查看完整版本: 怎样正确对 Keil长整数(long)赋值~~~