发布整个代码(如果需要)
/* multiplication of n1 and n2*/
#include<stdio.h>
int arr[200]; //for storing the binary representation of n2
int k=0; // to keep the count of the no of digits in the binary representation
void bin(int n)
{
if(n>1)
bin(n/2);
arr[k++]=n%2;
}
int main()
{
int n1=1500000;
int n2=10000000;
int i=0,t=0;
long long int temp,pro=0;
bin(n2); // calculating the binary of n2 and stroring in 'arr'
for(i=k-1; i>=0 ;i--)
{
temp = (n1*arr[i]) << t; /* Why need cast here ? */
pro = pro + temp;
t++;
}
printf("product: %lld",pro);
return 0;
}
在上面的程序中,我没有得到所需的输出。但是当我这样做时:
temp = (n1*(long long int)arr[i]) << t;
,
然后我得到了正确的输出!
我无法理解上述行为?
答案 0 :(得分:3)
您的系统int
似乎是32位而long long int
是64位。
n1
和arr[i]
都是int
,乘法结果则为int
。但int
中没有足够的位来保持答案,因为它太大了。
当您将操作的一个成员投射到long long int
时,结果也将是long long int
。
答案 1 :(得分:2)
两个整数之间的乘法变为整数,除非你将其中一个整数转换为其他整数。因此,在第一次乘法中,结果存储为整数(在32位系统上32位签名),在第二种情况下存储为长整数(32位系统上的64位无符号)。您可能更喜欢使用int64_t
等类型来提高可移植性。
您可以使用sizeof(int)
,sizeof(long long)
来查看两者之间的差异。
答案 2 :(得分:2)
我怀疑int
的大小不足以存储(n1*arr[i])
的结果,因此转换为(long long int)
可以提供足够的空间来存储结果。
int
不小于短。至少16位。
long long int
不小于长。至少64位。
答案 3 :(得分:2)
n1,以及arr [i],是整数。如果没有强制转换,则会得到整数乘法(可能会溢出),向左移动整数(再次产生可能溢出的整数结果),然后将该整数赋值给temp。
如果你将arr [i]投入很长时间,所有计算都会进行很长时间。因此,如果你的整数是32位(因此限制在大约2e10),你的整数将溢出,但长的长度,应该是64位,不会。