bios 发表于 2019-8-11 21:30:30

请教大家,C51两个数运算的问题

signed int angle=0;
unsigned long beats=0;

void main()
{

        angle=10*360;
        beats =(angle*4096)/360;


问题出现了,这两个式子这里,死活过不去。把angle的int型改为long型,就可以了,这是为什么呢?

bis 发表于 2019-8-11 21:42:56

ntwhq 发表于 2019-8-11 23:15:25

你写出的语句没问题,可能是其他代码影响导致编译通不过了。

bis 发表于 2019-8-11 23:28:06

壹法拉 发表于 2019-8-12 00:19:01

本帖最后由 壹法拉 于 2019-8-12 00:30 编辑

哼哼!这是典型的单片机出现的溢出BUG;
更常见的是 char (8位)类型的出现这类溢出的问题,这个类型的最大值是255;

int(16位) 类型是最大值是255X255; 你看看你那个,是4096* angle(最大时 4096X3600); 两数的数据类型不一致; 编译时要位数对齐;当然必须改为 long(32位)了!

要注意的是: c 语言的数据类型,在单片机编程与pc机编程时的位数不完全一致;

longshort 发表于 2019-8-12 07:21:29

强制类型呀,整数式子前加一个长整型符。

bios 发表于 2019-8-12 09:28:20

谢谢各位回复,涨见识了。
运算时,数据类型要一致。
我本来以为,会强制成long型呢

ntwhq 发表于 2019-8-12 10:10:06

bis 发表于 2019-8-11 23:28
3600*4096是多少啊???

怎么可能没问题,问题太大了。

我在KEIL 5中beats =(angle*4096)/360编译能通过。

haisens 发表于 2019-8-12 11:47:55

8bit系统中int占2字节,即最大32768,32bit系统中int占4字节,即最大2147483648‬ ,8bit系统中lang占4字节,即最大2147483648‬。

bis 发表于 2019-8-12 11:58:47

yangsen 发表于 2019-8-12 13:00:44

按倪angle的赋值(angle*4096)已经溢出了

hysy 发表于 2019-8-16 07:50:35

bios 发表于 2019-8-16 19:58:48

(angle*4096)请教大家,运算的结果,怎么会影响angle呢?

w6955 发表于 2019-8-16 20:12:40

bios 发表于 2019-8-16 19:58
(angle*4096)请教大家,运算的结果,怎么会影响angle呢?

乘积太大了,装不下了,系统会丢掉装不下的部分---出错了。

gxg0000 发表于 2019-8-17 16:36:32

bios 发表于 2019-8-16 19:58
(angle*4096)请教大家,运算的结果,怎么会影响angle呢?

在吃不准的情况下,单步运行程序,观察(Watch)变量值的变化,从而判断是否溢出。
页: [1] 2
查看完整版本: 请教大家,C51两个数运算的问题