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^13
和797966336
数据类型有关。这些不足以存储信息吗?如果没有,任何想法如何让它运行更大的数字?
答案 0 :(得分:23)
当然,您的输入为long
,但您的power
功能需要并返回int
!显然,你的系统上有32位...所以,在你的系统上,1.024×10 13 超过int
可以处理。
确保选择一个足够大的数据类型,并始终如一地使用它。即使long
可能还不够 - 请检查您的系统!
答案 1 :(得分:9)
首先,您需要将.subtitle_box bottom
的返回类型和输入参数类型从power()
更改为int
。否则,在long
和long
具有不同大小的系统上
当您传递int
时,输入参数可能会被截断为int
。
返回后,返回的值将被转换为long
,这可能会截断实际值。
之后,int
或int
(如果是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)
代码混合了int
,long
,并希望答案超出long
范围。
答案只是试图将10磅土豆放入5磅重的袋中。
...想法如何让它运行更大的数字。
uintmax_t
,unsigned long long
。随着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)其他一些细微差别。
long double
,Arbitrary-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之间的值。我认为这应该只涵盖你刚才可能遇到的每一个价值。