打印

请教关于C8051F一个移位运算问题(欢迎ayb_ice指教)

[复制链接]
1998|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
happystar|  楼主 | 2007-11-21 18:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是C8051F340,今天发现一个问题。
1、首先定义一个宏(4个字节组合32字节)
#define COMBINE_4CHAR_TO_32LONG(x1,x2,x3,x4)    ((ulong)((((uchar)(x1)) << 24) | (((uchar)(x2)) << 16) | (((uchar)(x3)) << 8) | ((uchar)(x4))))

2、在程序里边引用这个宏
#define PARAMETER_P  0.00390625
ulong recv_pq_value 
float valp;
high_byte8 = 0x01;middle_byte8 = 0x21; middle_byte = 0xc3;
recv_pq_value = COMBINE_4CHAR_TO_32LONG(0,high_byte8,middle_byte8,low_byte8);
valp = recv_pq_value * PARAMETER_P;
之后发现valp的值是36.7(运算的结果是直接把recv_pq_value中的高16位舍弃了)
不知道为什么呀?
3、如果改high_byte8 = 0xff;进行下边判断:
if(recv_pq_value & 0x800000){//判断正负
。。。。。。
}
硬件单步调试怎么也进不去里边。
这个程序我在TC里运行很正常(在89S52里我也做过类似这样的运算也成立呀),难道是MCU的问题。


相关帖子

沙发
ayb_ice| | 2007-11-21 19:26 | 只看该作者

感谢这么信任我

 错在宏定义这里,不太可靠
”((ulong)((((uchar)(x1)) << 24) | (((uchar)(x2)) << 16) | (((uchar)(x3)) << 8) | ((uchar)(x4))))“
其中的uchar都改成ulong即可,不改的话有时成立,有时不成立,
比如COMBINE_4CHAR_TO_32LONG(2,high_byte8,middle_byte8,low_byte8);这个就成立

使用特权

评论回复
板凳
农民讲习所| | 2007-11-21 19:50 | 只看该作者

用联合很简单

#define PARAMETER_P  0.00390625f

union VarU32{
  ulong  mU32;
  ushort mU16[2];
  uchar  mU8[4];
};

union VarU32 recv_pq_value
float valp;
recv_pq_value.mU8[0] = 0xc3;
recv_pq_value.mU8[1] = 0x21;
recv_pq_value.mU8[2] = 0x01;
recv_pq_value.mU8[3] = 0;

valp = (float)recv_pq_value.mU32 * PARAMETER_P;

使用特权

评论回复
地板
happystar|  楼主 | 2007-11-21 20:46 | 只看该作者

谢谢ayb_ice和老农

ayb_ice说的对,问题一定就在这里。唉!记得以前曾经就错过这里的,想不到今天又栽在这里了。多谢ayb_ice的提醒,明天是试试看。
老农的方法很好啊,执行的速度比我这个快多了,我这个还得来回移位转换什么的,谢谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

409

帖子

1

粉丝