SOS!怎样写才能得到真实结果?

[复制链接]
 楼主| ljm810010 发表于 2009-1-7 19:07 | 显示全部楼层 |阅读模式
C51,
三个变量
uchar A;
char B,C;
A *B 得一中间变量 (int)tmp,
C 只取中间变量的高8位,
怎样写才能使C得到正确结果?

C =(A*B)>>8;//错
C =((int)A * (int)B)>>8;//错
C = int((int)A * (int)B)>>8;//错

????????????????????????????;//对
E007 发表于 2009-1-7 19:29 | 显示全部楼层

这样定义试下



typedef union { int i;  char c[2];} S16;


    S16 tmp;
    tmp.i=a*b;
    c=tmp[0];
 楼主| ljm810010 发表于 2009-1-7 19:39 | 显示全部楼层

太复杂了吧?

我只是想让 C=A*B/256 ,竟然还要定义结构?
vwwj 发表于 2009-1-7 19:43 | 显示全部楼层

int是有符号位的

  改成无符号位或者屏蔽最高位
computer00 发表于 2009-1-7 20:08 | 显示全部楼层

C=(((signed int)((unsigned int)A))*((signed int)B))>>8;

 楼主| ljm810010 发表于 2009-1-7 20:14 | 显示全部楼层

谢谢各位,圈圈的定法我试过也不正确~~

HWM 发表于 2009-1-7 20:33 | 显示全部楼层

语义混淆,符号和无符号数混用自然会出现此类问题

建议全用unsigned char,保你安然无恙

C =(A*B)>>8;
HWM 发表于 2009-1-7 20:38 | 显示全部楼层

或采用:C = ((unsigned char)A*B)>>8

耕在此行 发表于 2009-1-7 21:08 | 显示全部楼层

不知这样是否可行

 C = A * B;
 C = ACC;
耕在此行 发表于 2009-1-7 21:26 | 显示全部楼层

楼主的变量得改下

定义成AA BB CC 否则产生冲突了.
 CC = AA * BB;
 CC = ACC;
刚才试了下,可以的.
 楼主| ljm810010 发表于 2009-1-7 21:39 | 显示全部楼层

耕在此行,我要求的是高8位不是低8位

你意思是否这样
CC = AA * BB;
CC = B;

也试了,还是不行
 楼主| ljm810010 发表于 2009-1-7 21:54 | 显示全部楼层

RE:HWM

按你8楼方法,还是不对;
按7楼提议全用unsigned char是有道理,但一个负数要转为无符号要怎样转?乘积为负怎样处理?
 楼主| ljm810010 发表于 2009-1-7 22:29 | 显示全部楼层

不好意思各位,是我搞糊涂了

按普通方法写就行,就得圈圈写的,HWM写的....都行!
是我持续工作搞混了,饭后头脑清醒了才发现。再次感谢谢楼上的各位~~~
computer00 发表于 2009-1-7 23:28 | 显示全部楼层

晕...搞了半天原来没错...

耕在此行 发表于 2009-1-8 08:23 | 显示全部楼层

呵呵

楼主 11楼的应该没错吧。
10楼的我看过反汇编的。
 楼主| ljm810010 发表于 2009-1-8 08:55 | 显示全部楼层

RE:耕在此行,按11楼方法,负数相乘不正确,正数就没问题

耕在此行 发表于 2009-1-8 11:32 | 显示全部楼层

你是要把符号给舍掉 负数变成正 是吗

AA = 0X33
BB = -0X55 = 0XAB 
你的结果如果是:
    CC = 0X55 * 0X33 的结果的高8位 那11楼的就不对。
如果要
    CC = 0XAB * 0X33 的结果的高8位,那11楼的办法应该是对的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

1195

帖子

0

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