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

[复制链接]
 楼主| 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

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