使用GCC的两个有符号64位乘法
我正在尝试使用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&
long long int A;//(A0,A1)
long long int B;//(B0,B1)
你能帮我做以下事情吗
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位,所以这不是问题所在。