请教大家,C51两个数运算的问题
signed int angle=0;unsigned long beats=0;
void main()
{
angle=10*360;
beats =(angle*4096)/360;
问题出现了,这两个式子这里,死活过不去。把angle的int型改为long型,就可以了,这是为什么呢?
你写出的语句没问题,可能是其他代码影响导致编译通不过了。 本帖最后由 壹法拉 于 2019-8-12 00:30 编辑
哼哼!这是典型的单片机出现的溢出BUG;
更常见的是 char (8位)类型的出现这类溢出的问题,这个类型的最大值是255;
int(16位) 类型是最大值是255X255; 你看看你那个,是4096* angle(最大时 4096X3600); 两数的数据类型不一致; 编译时要位数对齐;当然必须改为 long(32位)了!
要注意的是: c 语言的数据类型,在单片机编程与pc机编程时的位数不完全一致;
强制类型呀,整数式子前加一个长整型符。
谢谢各位回复,涨见识了。
运算时,数据类型要一致。
我本来以为,会强制成long型呢 bis 发表于 2019-8-11 23:28
3600*4096是多少啊???
怎么可能没问题,问题太大了。
我在KEIL 5中beats =(angle*4096)/360编译能通过。 8bit系统中int占2字节,即最大32768,32bit系统中int占4字节,即最大2147483648 ,8bit系统中lang占4字节,即最大2147483648。 按倪angle的赋值(angle*4096)已经溢出了 (angle*4096)请教大家,运算的结果,怎么会影响angle呢? bios 发表于 2019-8-16 19:58
(angle*4096)请教大家,运算的结果,怎么会影响angle呢?
乘积太大了,装不下了,系统会丢掉装不下的部分---出错了。 bios 发表于 2019-8-16 19:58
(angle*4096)请教大家,运算的结果,怎么会影响angle呢?
在吃不准的情况下,单步运行程序,观察(Watch)变量值的变化,从而判断是否溢出。
页:
[1]
2