为什么需要在以下程序中进行演员表?

时间:2013-12-12 13:42:44

标签: c casting

发布整个代码(如果需要)

 /* 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;

然后我得到了正确的输出!

我无法理解上述行为?

4 个答案:

答案 0 :(得分:3)

您的系统int似乎是32位而long long int是64位。

n1arr[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位。

查看C++ Data Types

答案 3 :(得分:2)

n1,以及arr [i],是整数。如果没有强制转换,则会得到整数乘法(可能会溢出),向左移动整数(再次产生可能溢出的整数结果),然后将该整数赋值给temp。

如果你将arr [i]投入很长时间,所有计算都会进行很长时间。因此,如果你的整数是32位(因此限制在大约2e10),你的整数将溢出,但长的长度,应该是64位,不会。