使用GCC的两个有符号64位乘法

使用GCC的两个有符号64位乘法,c,gcc,64-bit,arm,C,Gcc,64 Bit,Arm,我正在尝试使用GCC将两个有符号的64位长数据相乘 long long int A;//(A0,A1) long long int B;//(B0,B1) 你能帮我做以下事情吗 如何使用scanf输入64位数字 如何打印 把这两个数字相乘 scanf(“%lld”和&A) printf(“%lld”,A) A*B scanf(“%lld”和&A) printf(“%lld”,A) A*B 您不能确定long-long-int是64位。你应该试着做: #include <stdint.h&

我正在尝试使用GCC将两个有符号的64位长数据相乘

long long int A;//(A0,A1)
long long int B;//(B0,B1)
你能帮我做以下事情吗

  • 如何使用scanf输入64位数字
  • 如何打印
  • 把这两个数字相乘
  • scanf(“%lld”和&A)
  • printf(“%lld”,A)
  • A*B
  • scanf(“%lld”和&A)
  • printf(“%lld”,A)
  • A*B

  • 您不能确定
    long-long-int
    是64位。你应该试着做:

    #include <stdint.h>
    
    int64_t A, B;
    
    #包括
    int64_t A,B;
    
    您不能确定
    long-long-int
    是64位。你应该试着做:

    #include <stdint.h>
    
    int64_t A, B;
    
    #包括
    int64_t A,B;
    
    试试这个,我也在检查,并将对我的结果进行评论

    void mulul64(uint64 u, uint64 v, uint64 *whi, uint64 *wlo)
    {
    uint64 u0, u1, v0, v1, k, t;
    uint64 w0, w1, w2;
    u1 = u >> 32; u0 = u & 0xFFFFFFFF;
    v1 = v >> 32; v0 = v & 0xFFFFFFFF;
    t = u0*v0;
    w0 = t & 0xFFFFFFFF;
    k = t >> 32;
    t = u1*v0 + k;
    w1 = t & 0xFFFFFFFF;
    w2 = t >> 32;
    t = u0*v1 + w1;
    k = t >> 32;
    *wlo = (t << 32) + w0;
    *whi = u1*v1 + w2 + k;
    return;
    }
    
    void mulul64(uint64 u、uint64 v、uint64*whi、uint64*wlo)
    {
    uint64 u0,u1,v0,v1,k,t;
    uint64 w0,w1,w2;
    u1=u>>32;u0=u&0xFFFFFFFF;
    v1=v>>32;v0=v&0xFFFFFFFF;
    t=u0*v0;
    w0=t&0xFFFFFFFF;
    k=t>>32;
    t=u1*v0+k;
    w1=t&0xFFFFFFFF;
    w2=t>>32;
    t=u0*v1+w1;
    k=t>>32;
    
    *wlo=(t试试这个,我也在检查并将对我的结果进行评论

    void mulul64(uint64 u, uint64 v, uint64 *whi, uint64 *wlo)
    {
    uint64 u0, u1, v0, v1, k, t;
    uint64 w0, w1, w2;
    u1 = u >> 32; u0 = u & 0xFFFFFFFF;
    v1 = v >> 32; v0 = v & 0xFFFFFFFF;
    t = u0*v0;
    w0 = t & 0xFFFFFFFF;
    k = t >> 32;
    t = u1*v0 + k;
    w1 = t & 0xFFFFFFFF;
    w2 = t >> 32;
    t = u0*v1 + w1;
    k = t >> 32;
    *wlo = (t << 32) + w0;
    *whi = u1*v1 + w2 + k;
    return;
    }
    
    void mulul64(uint64 u、uint64 v、uint64*whi、uint64*wlo)
    {
    uint64 u0,u1,v0,v1,k,t;
    uint64 w0,w1,w2;
    u1=u>>32;u0=u&0xFFFFFFFF;
    v1=v>>32;v0=v&0xFFFFFFFF;
    t=u0*v0;
    w0=t&0xFFFFFFFF;
    k=t>>32;
    t=u1*v0+k;
    w1=t&0xFFFFFFFF;
    w2=t>>32;
    t=u0*v1+w1;
    k=t>>32;
    
    *wlo=(t第1项和第2项:阅读文档,然后使用
    %lli
    ?;)第1项和第2项:阅读文档,然后使用
    %lli
    ?;)答对了!您的问题解决了!感谢您的快速响应。我使用的是32位机器(ARM),我已经试过了,但是不起作用。由于寄存器只有32位,我使用长整型64位数据定义,那么乘法将大于64位。哦,你想要64x64->128位乘法吗?在这种情况下,你应该将操作数分成32位部分,并使用长乘法。是的,这就是我要做的。你能吗请给我更多的解释。谢谢你正试图将两个2位数的十进制数相乘得到一个4位数。像你小学时学的那样做长乘法。现在,用基数2^32代替基数10。答对了!你的成绩很好!谢谢你的快速反应。我在32位机器(ARM)上,我已经试过了,但是不起作用。由于寄存器只有32位,我使用长整型64位数据定义,那么乘法将大于64位。哦,你想要64x64->128位乘法吗?在这种情况下,你应该将操作数分成32位部分,并使用长乘法。是的,这就是我要做的。你能吗请给我更多的解释。谢谢你正试图用两个2位数的十进制数相乘得到一个4位数。像你小学时学的那样做长乘法。现在,用基数2^32代替基数10。谢谢,我会包括这一点,但要输入、输出和最后相乘?
    long
    始终至少是64位s、 所以这不是问题所在。谢谢,我将包括这一点,但是输入、输出和最终乘法?
    long
    始终至少是64位,所以这不是问题所在。