搜索
bottom↓
回复: 37

有没有支持64位乘法运算的开发环境?

[复制链接]

出0入0汤圆

发表于 2013-7-25 15:31:02 | 显示全部楼层 |阅读模式
本帖最后由 stirwl 于 2013-7-25 18:48 编辑

最经要算个大数,keilc只支持到32位,自己写64位乘法又出各种问题啊
我想找个能做32位乘法的就行了,最大能乘出64位。自己写了个程序,运行结果很奇怪啊
void main(void)
{
        unsigned long a=188,b=24910,c=188,d=24910;
        unsigned long x=1,y=1,z=1,w=1;
        unsigned long q1=1,q2=2,q3=3,q4=4;
        x=a*d;
        y=b*d;
        z=a*c;
        w=b*c;
        q4=y&0x0000ffff;
        q3=(q4>>16)+x+w;
        q2=(q3>>16)+z;
        q1=(q2>>16);
}

乘出来以后应该是q1-q4的4个低16位是所求的64位结果的,结果仿真的时候好多变量不知道怎么回事都跟着其他变量变

修改了一下公式,可以避免大整数计算了

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-7-25 15:35:20 | 显示全部楼层
看編譯器吧。
1箇64位數乘以另一箇64位數,得數最大可以是128位數。
呵呵,有沒有支持unsigned long long long int的編譯器?

出0入0汤圆

 楼主| 发表于 2013-7-25 15:43:58 | 显示全部楼层
qlb1234 发表于 2013-7-25 15:35
看編譯器吧。
1箇64位數乘以另一箇64位數,得數最大可以是128位數。
呵呵,有沒有支持unsigned long long l ...

我想找个能做32位乘法的就行了,最大能乘出64位。自己写了个程序,运行结果很奇怪啊
void main(void)
{
        unsigned long a=188,b=24910,c=188,d=24910;
        unsigned long x=1,y=1,z=1,w=1;
        unsigned long q1=1,q2=2,q3=3,q4=4;
        x=a*d;
        y=b*d;
        z=a*c;
        w=b*c;
        q4=y&0x0000ffff;
        q3=(q4>>16)+x+w;
        q2=(q3>>16)+z;
        q1=(q2>>16);
}

乘出来以后应该是q1-q4的4个低16位是所求的64位结果的,结果仿真的时候好多变量不知道怎么回事都跟着其他变量变

出0入0汤圆

发表于 2013-7-25 15:47:27 | 显示全部楼层
需要这么大精度的数据,还不如直接上ARM 好了,M3,M4大把的芯片,一下就可以解决了你的问题。

出0入0汤圆

发表于 2013-7-25 15:49:27 | 显示全部楼层
用那么费劲么?  用char a[256] x char b[256]
一位一位按照乘法规则用字符乘出来就ok了  得到的结果也是字符数组

出0入0汤圆

 楼主| 发表于 2013-7-25 15:52:59 | 显示全部楼层
yongjia 发表于 2013-7-25 15:47
需要这么大精度的数据,还不如直接上ARM 好了,M3,M4大把的芯片,一下就可以解决了你的问题。{:handshake: ...

ARM贵啊,用51便宜,而且个头小

出0入0汤圆

 楼主| 发表于 2013-7-25 15:53:37 | 显示全部楼层
lee_avr 发表于 2013-7-25 15:49
用那么费劲么?  用char a[256] x char b[256]
一位一位按照乘法规则用字符乘出来就ok了  得到的结果也是字 ...

好想法!
虽然浪费了一些空间,但计算简单了不少,不用想破脑袋了

出0入0汤圆

发表于 2013-7-25 16:05:26 | 显示全部楼层
试试IAR8051

出0入0汤圆

 楼主| 发表于 2013-7-25 16:11:45 | 显示全部楼层
i55x 发表于 2013-7-25 16:05
试试IAR8051


iar8051很奇怪,long 和long long 竟然都是32位的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-25 16:14:20 | 显示全部楼层
很久很久以前用过IAR8051,似乎还有一个DLIB里面的类型比较长。

出0入4汤圆

发表于 2013-7-25 16:19:52 | 显示全部楼层
论坛里有算法啊

出0入0汤圆

 楼主| 发表于 2013-7-25 16:22:31 | 显示全部楼层
i55x 发表于 2013-7-25 16:14
很久很久以前用过IAR8051,似乎还有一个DLIB里面的类型比较长。

刚去看了一下,估计Dlib也不支持64位运算……

出0入0汤圆

发表于 2013-7-25 16:50:14 | 显示全部楼层
  1. __int64 Calculat(unsigned long int a,unsigned long int b)
  2. {
  3.         unsigned long int i = 0;
  4.         __int64 result = 0;
  5.         for(i = 0; i < a;i++)
  6.         {
  7.                 result += b;
  8.         }
  9.         return result;
  10. }
复制代码

看了一下结果对比,高32位丢失了。
  1. t = Calculat(0x1234567812345678,0x1111111122222222);
  2.         printf("%x,  %d \r\n",t,t);
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-25 16:52:39 | 显示全部楼层
楼上看不懂撸主要用8051的编译器就别出来丢人现眼了。

出0入0汤圆

 楼主| 发表于 2013-7-25 16:55:30 | 显示全部楼层
wajlh 发表于 2013-7-25 16:19
论坛里有算法啊

在哪啊?
我搜了一下没搜出来哎,
是单片机上的算法吗?
(PS.每小时只能回复5个,也发不了短消息,只能过1个小时再发了)

出0入0汤圆

 楼主| 发表于 2013-7-25 17:00:07 | 显示全部楼层
xf331785508 发表于 2013-7-25 16:50
看了一下结果对比,高32位丢失了。

估计累加的时候编译器把数据都转换成long型的了吧,一般的编译器都会这么干

出0入0汤圆

发表于 2013-7-25 17:17:30 | 显示全部楼层
i55x 发表于 2013-7-25 16:52
楼上看不懂撸主要用8051的编译器就别出来丢人现眼了。

别动不动就人身攻击!素质!!!!

出0入0汤圆

发表于 2013-7-25 18:06:49 来自手机 | 显示全部楼层
转换成浮点型如何?哪位大神科普一下

出0入0汤圆

 楼主| 发表于 2013-7-25 18:11:20 | 显示全部楼层
信天游 发表于 2013-7-25 18:06
转换成浮点型如何?哪位大神科普一下

转换成浮点数是可以处理更大的数了,但是会丢失数据呢

出0入0汤圆

发表于 2013-7-25 23:17:51 来自手机 | 显示全部楼层
算法不少,网上有的,自己搜搜“c51 多字节乘法”
比如 匠人那个移位法

出0入0汤圆

 楼主| 发表于 2013-7-25 23:24:21 | 显示全部楼层
BXAK 发表于 2013-7-25 23:17
算法不少,网上有的,自己搜搜“c51 多字节乘法”
比如 匠人那个移位法

恩,好多都是用汇编的,
其实我觉得上面我写的那段程序也应该能算的出来,但不知道为什么计算的时候对一个变量赋值其他的也会跟着变

出0入0汤圆

发表于 2013-7-26 11:25:15 | 显示全部楼层
如何可求出呢?教一教?

出0入0汤圆

发表于 2013-7-26 11:35:45 | 显示全部楼层
stirwl 发表于 2013-7-25 15:52
ARM贵啊,用51便宜,而且个头小

STM32F103CBXX之类的,封装很小的,资源足够你用了

出0入0汤圆

 楼主| 发表于 2013-7-26 22:07:45 | 显示全部楼层
yongjia 发表于 2013-7-26 11:35
STM32F103CBXX之类的,封装很小的,资源足够你用了

用的资源倒不是很多,关键要计算32位乘法,那应该支持到64位乘法运算才行啊

出0入0汤圆

 楼主| 发表于 2013-7-26 22:08:42 | 显示全部楼层
mbass51 发表于 2013-7-26 11:25
如何可求出呢?教一教?

上面的代码就能求出来,不过在vc下运行没问题,在keil下就有问题了,还没找到原因呢

出0入0汤圆

发表于 2013-7-27 10:01:54 | 显示全部楼层
因为Keil C51本身并不支持Int64,long long之类的数据类型。
只能完全自己用函数写。比如用字数组或长字数组,用字符数组也可以。

出0入0汤圆

 楼主| 发表于 2013-7-27 12:41:55 | 显示全部楼层
fastweb 发表于 2013-7-27 10:01
因为Keil C51本身并不支持Int64,long long之类的数据类型。
只能完全自己用函数写。比如用字数组或长字数 ...

写了一段,就最上面那段,但是在vc里运行没问题,在keil下仿真就有问题了

出0入34汤圆

发表于 2013-7-27 13:39:55 | 显示全部楼层
楼主请参考这帖-> 8位单片机,大数运算,可以运算任意位数的乘除法  看看能否有些帮助 ...

出0入0汤圆

 楼主| 发表于 2013-7-27 14:12:07 | 显示全部楼层
xyz543 发表于 2013-7-27 13:39
楼主请参考这帖-> 8位单片机,大数运算,可以运算任意位数的乘除法  看看能否有些帮助 ...  ...

刚看了下,就是这个东西,
3Q very much!

出0入34汤圆

发表于 2013-7-27 15:21:38 | 显示全部楼层
stirwl 发表于 2013-7-27 14:12
刚看了下,就是这个东西,
3Q very much!

不客气,您合用就好 ...

出0入0汤圆

发表于 2013-7-29 10:16:30 | 显示全部楼层
stirwl 发表于 2013-7-26 22:07
用的资源倒不是很多,关键要计算32位乘法,那应该支持到64位乘法运算才行啊 ...

要支持64位乘法,低档的MCU你需要自己处理,找找汇编的也许比较方便,如果是ARM的,32位乘法就方便了

出0入0汤圆

发表于 2013-7-29 10:50:33 | 显示全部楼层
看帖积极回帖,增加莫元

出0入0汤圆

发表于 2013-7-29 10:51:52 | 显示全部楼层
看帖积极回帖,增加莫元

出0入0汤圆

发表于 2013-7-29 18:35:07 | 显示全部楼层
记号一下,万能的神坛,总会找到解决问题的方法

出0入0汤圆

 楼主| 发表于 2013-7-30 09:58:30 | 显示全部楼层
yongjia 发表于 2013-7-29 10:16
要支持64位乘法,低档的MCU你需要自己处理,找找汇编的也许比较方便,如果是ARM的,32位乘法就方便了 ...

恩,主要是处理算法在vc上运行没问题,在keil上仿真就有问题了

出0入0汤圆

 楼主| 发表于 2013-7-30 09:59:21 | 显示全部楼层
xyz543 发表于 2013-7-27 15:21
不客气,您合用就好 ...

最后还是偷了一下懒,先算除法再算乘法就不用计算大数了

出0入34汤圆

发表于 2013-7-30 10:04:01 | 显示全部楼层
stirwl 发表于 2013-7-30 09:59
最后还是偷了一下懒,先算除法再算乘法就不用计算大数了

这是当然的,您的需求不是要显示这么多位数的话,就您说的这做法就行了 ...

出0入0汤圆

发表于 2013-7-30 14:15:50 | 显示全部楼层
能够解决问题就可以了,现在估计楼主已经搞定这个问题了吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表