打印

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

[复制链接]
1845|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljm810010|  楼主 | 2009-1-7 19:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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是有符号位的

  改成无符号位或者屏蔽最高位

使用特权

评论回复
5
computer00| | 2009-1-7 20:08 | 只看该作者

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

使用特权

评论回复
6
ljm810010|  楼主 | 2009-1-7 20:14 | 只看该作者

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

使用特权

评论回复
7
HWM| | 2009-1-7 20:33 | 只看该作者

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

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

C =(A*B)>>8;

使用特权

评论回复
8
HWM| | 2009-1-7 20:38 | 只看该作者

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

使用特权

评论回复
9
耕在此行| | 2009-1-7 21:08 | 只看该作者

不知这样是否可行

 C = A * B;
 C = ACC;

使用特权

评论回复
10
耕在此行| | 2009-1-7 21:26 | 只看该作者

楼主的变量得改下

定义成AA BB CC 否则产生冲突了.
 CC = AA * BB;
 CC = ACC;
刚才试了下,可以的.

使用特权

评论回复
11
ljm810010|  楼主 | 2009-1-7 21:39 | 只看该作者

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

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

也试了,还是不行

使用特权

评论回复
12
ljm810010|  楼主 | 2009-1-7 21:54 | 只看该作者

RE:HWM

按你8楼方法,还是不对;
按7楼提议全用unsigned char是有道理,但一个负数要转为无符号要怎样转?乘积为负怎样处理?

使用特权

评论回复
13
ljm810010|  楼主 | 2009-1-7 22:29 | 只看该作者

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

按普通方法写就行,就得圈圈写的,HWM写的....都行!
是我持续工作搞混了,饭后头脑清醒了才发现。再次感谢谢楼上的各位~~~

使用特权

评论回复
14
computer00| | 2009-1-7 23:28 | 只看该作者

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

使用特权

评论回复
15
耕在此行| | 2009-1-8 08:23 | 只看该作者

呵呵

楼主 11楼的应该没错吧。
10楼的我看过反汇编的。

使用特权

评论回复
16
ljm810010|  楼主 | 2009-1-8 08:55 | 只看该作者

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

使用特权

评论回复
17
耕在此行| | 2009-1-8 11:32 | 只看该作者

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

AA = 0X33
BB = -0X55 = 0XAB 
你的结果如果是:
    CC = 0X55 * 0X33 的结果的高8位 那11楼的就不对。
如果要
    CC = 0XAB * 0X33 的结果的高8位,那11楼的办法应该是对的。

使用特权

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

本版积分规则

38

主题

1195

帖子

0

粉丝