yanjiesh 发表于 2013-10-10 09:17:30

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

各位达人,在下正在做一个项目,软件驱动涉及到64bit的乘除法,请教下 哪位高手成功完成了32bitMCU来做64bit乘除法? 有没有现成的库函数啊? 谢谢。

lcofjp 发表于 2013-10-10 09:19:59

这个是编译器做的事情,编译器会自动实现,前提是编译器支持long long数据类型。

yanjiesh 发表于 2013-10-10 09:33:56

lcofjp 发表于 2013-10-10 09:19 static/image/common/back.gif
这个是编译器做的事情,编译器会自动实现,前提是编译器支持long long数据类型。 ...

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

lcofjp 发表于 2013-10-10 09:40:44

yanjiesh 发表于 2013-10-10 09:33 static/image/common/back.gif
谢谢您的信息 但是我清楚—— 我用的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) 8 1   (byte-aligned)
wchar_t (C++ only) 16 2   (halfword-aligned)
stdbool.h can be used to define the bool macro in C.

yanjiesh 发表于 2013-10-10 09:54:00

lcofjp 发表于 2013-10-10 09:40 static/image/common/back.gif
那只是说你没使用过,不代表不支持。

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


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

lcofjp 发表于 2013-10-10 09:55:27

yanjiesh 发表于 2013-10-10 09:54 static/image/common/back.gif
呵呵 谢谢 看来 uVision支持这个数据类型 但是不知有没有 现成的库函数可用呢? 您玩过吗?...

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

yanjiesh 发表于 2013-10-10 10:04:16

lcofjp 发表于 2013-10-10 09:55 static/image/common/back.gif
我不太清楚你所谓的库函数是指什么。

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

szszjdb 发表于 2013-10-10 10:07:46

兄弟,试下不就清楚了?

XIVN1987 发表于 2013-10-10 10:07:55

yanjiesh 发表于 2013-10-10 10:04 static/image/common/back.gif
我想指的是 类似 Math.h 中有没有 64bit的乘除法的函数 或者类似ST公司给CM系列配的开发库中的函数 ...

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

z = x * y;

应该就可以了。。

lcofjp 发表于 2013-10-10 10:13:01

yanjiesh 发表于 2013-10-10 10:04 static/image/common/back.gif
我想指的是 类似 Math.h 中有没有 64bit的乘除法的函数 或者类似ST公司给CM系列配的开发库中的函数 ...

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

mhw 发表于 2013-10-10 10:17:00

9楼是对的……

yanjiesh 发表于 2013-10-10 10:17:51

lcofjp 发表于 2013-10-10 10:13 static/image/common/back.gif
乘除法还需要函数么,不就是*、/运算符么。
一般的库函数是不支持long long的,你可以在传参数的时候转换 ...

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

yanjiesh 发表于 2013-10-10 10:27:13

XIVN1987 发表于 2013-10-10 10:07 static/image/common/back.gif
long long int x = 412342342342LL;
long long int y = 3423435645645LL;
long long int z;


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

yanjiesh 发表于 2013-10-10 10:28:27

mhw 发表于 2013-10-10 10:17 static/image/common/back.gif
9楼是对的……

谢谢您的意见 我试下再回复大家 谢谢了。{:smile:}

金牛AKI 发表于 2013-10-10 10:34:21

这么我也想知道 真的想知道

yanjiesh 发表于 2013-10-10 10:39:04

金牛AKI 发表于 2013-10-10 10:34 static/image/common/back.gif
这么我也想知道 真的想知道

朋友 你也遇到同样的麻烦吗?{:smile:}

yanjiesh 发表于 2013-10-11 10:36:38

本帖最后由 yanjiesh 于 2013-10-11 10:54 编辑

先上段代码 请大家提意见 {:smile:}

#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)                              
        {
        }
};
// 文件结束------------------------------------------------------------------

leon...... 发表于 2013-10-11 10:39:46

水平有限表示看不懂,但我想这种问题只有多实验才有真实的收获吧

yanjiesh 发表于 2013-10-11 10:55:31

leon...... 发表于 2013-10-11 10:39 static/image/common/back.gif
水平有限表示看不懂,但我想这种问题只有多实验才有真实的收获吧

{:smile:}谢谢你的意见

yanjiesh 发表于 2013-10-11 11:05:55

完成实验 但是还是有疑问 需要大家一起找找茬 {:smile:}

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

gzhuli 发表于 2013-10-11 11:19:00

本帖最后由 gzhuli 于 2013-10-11 11:23 编辑

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

yanjiesh 发表于 2013-10-11 11:50:29

gzhuli 发表于 2013-10-11 11:19 static/image/common/back.gif
溢出了,两个64位数相乘结果是有可能超过64位的,最多可以去到128位。

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

不知大家的意见如何{:smile:}

yanjiesh 发表于 2013-10-11 13:21:50

最后改了b的赋值为0x7877665544332211,乘积也为64bit了,估计与符号位有关,但是为何unsigned 无效呢?继续求解,{:smile:} 有高人可以帮忙解释吗?

gzhuli 发表于 2013-10-11 14:00:35

本帖最后由 gzhuli 于 2013-10-11 14:10 编辑

yanjiesh 发表于 2013-10-11 11:50 static/image/common/back.gif
感觉是溢出 但是 以前的经验 是 溢出的结果 是 去除高位的数 位数应该不会少 上面实验的结果是 少了一个b ...

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

yanjiesh 发表于 2013-10-11 15:16:18

gzhuli 发表于 2013-10-11 14:00 static/image/common/back.gif
0x1122334455667788 * 0x8877665544332211 = 0x092228fb777ae38f 0a3e963337c60008
最高4位是0,省略掉了 ...

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

yanjiesh 发表于 2013-11-26 08:47:22

后来 NXP的expert说了 支持fixed的运算,再问了高手才知道,编译器能帮你搞定floating 或者 fixed ,当然 64bit的运算 也是这个道理了。分享给大家,工作学习顺利!
页: [1]
查看完整版本: 关于CM0是否可以支持64bit乘除法的咨询?