搜索
bottom↓
回复: 25

关于CM0是否可以支持64bit乘除法的咨询?

[复制链接]

出0入0汤圆

发表于 2013-10-10 09:17:30 | 显示全部楼层 |阅读模式
各位达人,在下正在做一个项目,软件驱动涉及到64bit的乘除法,请教下 哪位高手成功完成了32bitMCU来做64bit乘除法? 有没有现成的库函数啊? 谢谢。

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-10-10 09:19:59 | 显示全部楼层
这个是编译器做的事情,编译器会自动实现,前提是编译器支持long long数据类型。

出0入0汤圆

 楼主| 发表于 2013-10-10 09:33:56 | 显示全部楼层
lcofjp 发表于 2013-10-10 09:19
这个是编译器做的事情,编译器会自动实现,前提是编译器支持long long数据类型。 ...

谢谢您的信息 但是我清楚—— 我用的Keil uvision 4 好像没有定义过 long long数据类型,不知道哪位大侠有解决过类似问题的 经验呢 ? 是否一定需要自己编写代码来拆分两个64bit数据相乘的工作为四个32bit数据的相乘的工作呢?

出0入0汤圆

发表于 2013-10-10 09:40:44 | 显示全部楼层
yanjiesh 发表于 2013-10-10 09:33
谢谢您的信息 但是我清楚—— 我用的Keil uvision 4 好像没有定义过 long long数据类型,不知道哪位大侠 ...

那只是说你没使用过,不代表不支持。

给你贴一段MDK支持的数据类型:
Basic data types
ARM Compiler toolchain v5.02 for µVision Compiler Reference  

Home > C and C++ Implementation Details > Basic data types

Basic data types
This following basic data types are implemented in ARM C and C++:

Size and alignment of basic data types
Table 32 gives the size and natural alignment of the basic data types.

Table 32. Size and alignment of data types

Type Size in bits Natural alignment in bytes
char 8 1   (byte-aligned)
short 16 2   (halfword-aligned)
int 32 4   (word-aligned)
long 32 4   (word-aligned)
long long 64 8   (doubleword-aligned)
float 32 4   (word-aligned)
double 64 8   (doubleword-aligned)
long double 64 8   (doubleword-aligned)
All pointers 32 4   (word-aligned)
bool (C++ only) 8 1   (byte-aligned)
_Bool (C only[a]) 8 1   (byte-aligned)
wchar_t (C++ only) 16 2   (halfword-aligned)
[a] stdbool.h can be used to define the bool macro in C.

出0入0汤圆

 楼主| 发表于 2013-10-10 09:54:00 | 显示全部楼层
lcofjp 发表于 2013-10-10 09:40
那只是说你没使用过,不代表不支持。

给你贴一段MDK支持的数据类型:

呵呵 谢谢 看来 uVision支持这个数据类型 但是不知有没有 现成的库函数可用呢? 您玩过吗?

出0入0汤圆

发表于 2013-10-10 09:55:27 | 显示全部楼层
yanjiesh 发表于 2013-10-10 09:54
呵呵 谢谢 看来 uVision支持这个数据类型 但是不知有没有 现成的库函数可用呢? 您玩过吗?  ...

我不太清楚你所谓的库函数是指什么。

出0入0汤圆

 楼主| 发表于 2013-10-10 10:04:16 | 显示全部楼层
lcofjp 发表于 2013-10-10 09:55
我不太清楚你所谓的库函数是指什么。

我想指的是 类似 Math.h 中有没有 64bit的乘除法的函数 或者类似ST公司给CM系列配的开发库中的函数

出0入0汤圆

发表于 2013-10-10 10:07:46 | 显示全部楼层
兄弟,试下不就清楚了?

出0入25汤圆

发表于 2013-10-10 10:07:55 | 显示全部楼层
yanjiesh 发表于 2013-10-10 10:04
我想指的是 类似 Math.h 中有没有 64bit的乘除法的函数 或者类似ST公司给CM系列配的开发库中的函数 ...

long long int x = 412342342342LL;
long long int y = 3423435645645LL;
long long int z;

z = x * y;

应该就可以了。。

出0入0汤圆

发表于 2013-10-10 10:13:01 | 显示全部楼层
yanjiesh 发表于 2013-10-10 10:04
我想指的是 类似 Math.h 中有没有 64bit的乘除法的函数 或者类似ST公司给CM系列配的开发库中的函数 ...

乘除法还需要函数么,不就是*、/运算符么。
一般的库函数是不支持long long的,你可以在传参数的时候转换一下就可以了。

出0入0汤圆

发表于 2013-10-10 10:17:00 | 显示全部楼层
9楼是对的……

出0入0汤圆

 楼主| 发表于 2013-10-10 10:17:51 | 显示全部楼层
lcofjp 发表于 2013-10-10 10:13
乘除法还需要函数么,不就是*、/运算符么。
一般的库函数是不支持long long的,你可以在传参数的时候转换 ...

因为担心 简单的*/ 是否可以, 也不确定。 所以曾经查过,而且 网上也有人说似乎调用了一个Math.h里的函数, 但是我却没能找到。 所以才来咨询下 是否有高人已经玩过这个 呵呵,谢谢。

出0入0汤圆

 楼主| 发表于 2013-10-10 10:27:13 | 显示全部楼层
XIVN1987 发表于 2013-10-10 10:07
long long int x = 412342342342LL;
long long int y = 3423435645645LL;
long long int z;

谢谢您的回复 估计您试过成功了  我找时间我试下吧

出0入0汤圆

 楼主| 发表于 2013-10-10 10:28:27 | 显示全部楼层
mhw 发表于 2013-10-10 10:17
9楼是对的……

谢谢您的意见 我试下再回复大家 谢谢了。

出0入0汤圆

发表于 2013-10-10 10:34:21 | 显示全部楼层
这么我也想知道 真的想知道

出0入0汤圆

 楼主| 发表于 2013-10-10 10:39:04 | 显示全部楼层
金牛AKI 发表于 2013-10-10 10:34
这么我也想知道 真的想知道

朋友 你也遇到同样的麻烦吗?

出0入0汤圆

 楼主| 发表于 2013-10-11 10:36:38 | 显示全部楼层
本帖最后由 yanjiesh 于 2013-10-11 10:54 编辑

先上段代码 请大家提意见

#include "LPC11xx.h"                        /* LPC11xx definitions */
//#include "timer16.h"
#include "clkconfig.h"
//#include "gpio.h"

extern putch(char data);
// main()函数  ----------------------------------------------------------------
int main (void) {
        unsigned char f;
        unsigned char e;
       
        long long int a,b,c;       

        // 系统初始化       
        SystemInit();
        // 为了方便调试,可配置CLKOUT
//        CLKOUT_Setup( CLKOUTCLK_SRC_MAIN_CLK );
//        LPC_IOCON->PIO0_1 &= ~0x07;       
//        LPC_IOCON->PIO0_1 |= 0x01;                                        /* P0.1 -- CLK OUT */
       
        // 使能AHB时钟,为GPIO提供时钟源
        LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
       
        // 进入死循环
       
        a = 1122334455667788ll;
        b = 8877665544332211ll;
        c = a*b;
        e = 64 ;  // 移位总量;
        while ( e >0 )
        {
                 e -= 2;
                f = c >> e;
                putch(f);
        }
       
        while (1)                                
        {
        }
};
// 文件结束  ------------------------------------------------------------------  

出0入0汤圆

发表于 2013-10-11 10:39:46 | 显示全部楼层
水平有限表示看不懂,但我想这种问题只有多实验才有真实的收获吧

出0入0汤圆

 楼主| 发表于 2013-10-11 10:55:31 | 显示全部楼层
leon...... 发表于 2013-10-11 10:39
水平有限表示看不懂,但我想这种问题只有多实验才有真实的收获吧

  谢谢你的意见

出0入0汤圆

 楼主| 发表于 2013-10-11 11:05:55 | 显示全部楼层
完成实验 但是还是有疑问 需要大家一起找找茬

乘积的位数 反而 比因数的位数少? 这是什么道理 ?

本帖子中包含更多资源

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

x

出0入618汤圆

发表于 2013-10-11 11:19:00 | 显示全部楼层
本帖最后由 gzhuli 于 2013-10-11 11:23 编辑

溢出了,两个64位数相乘结果是有可能超过64位的,最多可以去到128位。

出0入0汤圆

 楼主| 发表于 2013-10-11 11:50:29 | 显示全部楼层
gzhuli 发表于 2013-10-11 11:19
溢出了,两个64位数相乘结果是有可能超过64位的,最多可以去到128位。

感觉是溢出 但是 以前的经验 是 溢出的结果 是 去除高位的数 位数应该不会少 上面实验的结果是 少了一个byte 共8 bit。

不知大家的意见如何  

出0入0汤圆

 楼主| 发表于 2013-10-11 13:21:50 | 显示全部楼层
最后改了b的赋值为0x7877665544332211,乘积也为64bit了,估计与符号位有关,但是为何unsigned 无效呢?继续求解, 有高人可以帮忙解释吗?

出0入618汤圆

发表于 2013-10-11 14:00:35 | 显示全部楼层
本帖最后由 gzhuli 于 2013-10-11 14:10 编辑
yanjiesh 发表于 2013-10-11 11:50
感觉是溢出 但是 以前的经验 是 溢出的结果 是 去除高位的数 位数应该不会少 上面实验的结果是 少了一个b ...


0x1122334455667788 * 0x8877665544332211 = 0x092228fb777ae38f 0a3e963337c60008
最高4位是0,省略掉了。

出0入0汤圆

 楼主| 发表于 2013-10-11 15:16:18 | 显示全部楼层
gzhuli 发表于 2013-10-11 14:00
0x1122334455667788 * 0x8877665544332211 = 0x092228fb777ae38f 0a3e963337c60008
最高4位是0,省略掉了 ...

的确有道理,我用windows的计算器算了下,两者的乘积是1.2140421274884643877217248716451 e+37 ,转成十进制后 只有A3E963337C60008,再转回十进制已非前面的长数了,所以,像gzhuli朋友讲的,估计是上四个字节被省略的道理。谢谢。结论有了。只要编译器支持long long int 类型的变量类型,64bit的乘法可以实现,估计除法同理实现。谢谢大家了。

出0入0汤圆

 楼主| 发表于 2013-11-26 08:47:22 | 显示全部楼层
后来 NXP的expert说了 支持fixed的运算,再问了高手才知道,编译器能帮你搞定floating 或者 fixed ,当然 64bit的运算 也是这个道理了。分享给大家,工作学习顺利!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 14:46

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

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