为什么我无法以长数据类型存储数据?

时间:2015-10-02 10:58:14

标签: c types long-integer

b

此功能用于执行&#34;&#34; 操作的功能,就像在计算器上一样,所以如果我写:#include <stdio.h> using namespace std; int main(){ char a[5], b[5]; int i; for(i = 0; i < 5; i++){ scanf("%c", a + i); } for(i = 0; i < 5; i++){ scanf("%c", b + i); } printf("%c", b[2]); } 它会给我5的功率3和打印125

问题是,如果数字类似于:int power(int first,int second) { int counter1 = 0; long ret = 1; while (counter1 != second){ ret *= first; counter1 += 1; } return ret; } int main(int argc,char **argv) { long one = atol(argv[1]); long two = atol(argv[2]); char word[30]; long finally; printf("What is the operation? 'power','factorial' or 'recfactorial'\n"); scanf("%20s",word); if (strcmp("power",word) == 0){ finally = power(one,two); printf("%ld\n",finally); return 0; } } ,20为10的幂,我希望看到结果:./a.out 5 3,但它会输出./a.out 20 10 }。

我得到的当前输出的原因是什么?

注意:我认为这与1.024 x 10^13797966336数据类型有关。这些不足以存储信息吗?如果没有,任何想法如何让它运行更大的数字?

6 个答案:

答案 0 :(得分:23)

当然,您的输入为long,但您的power功能需要并返回int!显然,你的系统上有32位...所以,在你的系统上,1.024×10 13 超过int可以处理。

确保选择一个足够大的数据类型,并始终如一地使用它。即使long可能还不够 - 请检查您的系统!

答案 1 :(得分:9)

首先,您需要将.subtitle_box bottom的返回类型和输入参数类型从power()更改为int。否则,在longlong具有不同大小的系统上

  1. 当您传递int时,输入参数可能会被截断为int

  2. 返回后,返回的值将被转换为long,这可能会截断实际值。

  3. 之后,intint(如果是32位)不能保持1.024×10 13 (10240000000000)。您需要使用宽度更大的数据类型,例如long

答案 2 :(得分:4)

一个和两个很长。

long one = atol(argv[1]);
long two = atol(argv[2]);

你用它们调用这个函数

int power(int first, int second);

但是你的函数需要int,这里有一个隐式转换,并返回int。所以现在,你的long是int,导致一个未定义的行为(见注释)。

答案 3 :(得分:2)

快速回答:

隐式转换power函数的值。

更改函数参数,然后键入其他可以包含更大值的int,其中一种可能类型为long

  • 输入值的类型转换和截断以匹配函数的参数。

  • 函数体中的计算结果将再次转换为匹配返回类型,在您的情况下int:无法处理值的大小。

注意 1 :正如经验丰富的成员所述,存在特定于机器的问题,即您的int类型未处理通常的大小int应该处理。

1。要完成答案

答案 4 :(得分:2)

代码混合了intlong,并希望答案超出long范围。

答案只是试图将10磅土豆放入5磅重的袋中。

  

...想法如何让它运行更大的数字。

  1. 使用可用的最宽整数。示例:uintmax_tunsigned long long
  2. 随着C99向前,通常最大的可表示整数将是UINTMAX_MAX

    #include <stdint.h>
    
    uintmax_t power_a(long first, long second) {
      long counter1 = 0;
      uintmax_t ret = 1;
    
      while (counter1 != second){  // number of iterations could be in the billions
        ret *= first;
        counter1 += 1;
      }
      return ret;
    }
    

    但是,让我们避免使用负数的问题行为,并提高计算从班轮到指数的效率。

    // return x raised to the y power
    uintmax_t pow_jululu(unsigned long x, unsigned long y) {
      uintmax_t z = 1;
      uintmax_t base = x;
      while (y) {   // max number of iterations would bit width: e.g. 64
        if (y & 1) {
          z *= base;
        }
        y >>= 1;
        base *= base;
      }
      return z;
    }
    
    int main(int argc,char **argv) {
        assert(argc >= 3);
        unsigned long one = strtoul(argv[1], 0, 10);
        unsigned long two = strtoul(argv[2], 0, 10);
        uintmax_t finally = pow_jululu(one,two);
        printf("%ju\n",finally);
        return 0;
    }
    

    这种方法也有限制。 1)z *= base可以在数学上溢出pow_jululu(2, 1000)之类的调用。 2)base*base可能会在unsigned long超过uintmax_t宽度一半的罕见情况下以数学方式溢出。 3)其他一些细微差别。

    1. 诉诸其他类型,例如:long doubleArbitrary-precision arithmetic。这可能超出了这个简单任务的范围。

答案 5 :(得分:-1)

你可以使用长度为8个字节的long long而不是long和int的4个字节长度。

long long将为您提供-9,223,372,036,854,775,808至9,223,372,036,854,775,807之间的值。我认为这应该只涵盖你刚才可能遇到的每一个价值。