8位的单片机可不可以直接对16位数进行运算?

[复制链接]
 楼主| gmgmgm 发表于 2009-9-7 09:43 | 显示全部楼层 |阅读模式
本帖最后由 gmgmgm 于 2009-9-7 10:41 编辑

刚入C不久,在实际调试中会出现一些不明白的错误,就是对两个16位的数据直接运算,有时会跑飞了,怀凝的是单片机是8位的,而数据是16位的,不知道有没有关系?
比如:

uint a=0x24a5;
uint b=0xa53c;
uchar s=0x2d;
uint c;

c=b-a;//这里是两位16位的数相减

c=b-s;//这里是16位数与8位数相减

c=b+s;//这里是16位与8位相加

调试时发现运算结果是正确的,但因为程序经常跑飞,怀凝是这样的运算造成的,请前辈指点下,谢谢!
auzxj 发表于 2009-9-7 10:15 | 显示全部楼层
1)、前四句应该有分号
2)、程序中有while(1);一类的死循环吗
3)、是否有狗,有的话,狗拴住了没
PowerAnts 发表于 2009-9-7 10:16 | 显示全部楼层
8位机运行16位运算? 也许分成高8位和低8位来处理,但两个字节间怎样凑起来,可能很麻烦

声明: 俺是门外汉
HWM 发表于 2009-9-7 10:23 | 显示全部楼层
LZ:只要你的编译系统是健壮的,问题决不可能由此所致。成熟的C编译会对所有能提供的类型运算应该提供很好的包装(底层实现是透明的),查查其他地方。
 楼主| gmgmgm 发表于 2009-9-7 10:39 | 显示全部楼层
里面有while(1)语句,这些运算就是在while(1)里面的,就是要运算结果为达到目标时才退出这个死循环,问题是有时候很正常 ,里面没有用狗,有时候就卡死在里面,我用的是Keil uVision2编译系统;就是怀凝是不是因为这样8位和16位数据混合造成的;

上面前三行是有分号;在这里忘了加进去
auzxj 发表于 2009-9-7 11:55 | 显示全部楼层
8位和16位数据混合是不会有问题的,在标准C里,会先把8位强制类型转换为16位,再运算,这个可以查阅相关C语言书
就是要运算结果为达到目标时才退出这个死循环,

这句话我不明白什么意思,难道你的程序在某种情况下能退出死循环??
强烈要求贴关键的代码
XZL 发表于 2009-9-7 13:05 | 显示全部楼层
8位机在C语言下可以实现16位运算。不过不是直接运算,而是调用库函数
auzxj 发表于 2009-9-7 16:08 | 显示全部楼层
这个貌似不用什么库函数吧,很简单的,汇编语言几句话就可以了,在8位机上用汇编语言写一下16位的数据运算就知道怎么回事了,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

135

主题

766

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部