Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当I';我在加正数?_C++ - Fatal编程技术网

C++ 当I';我在加正数?

C++ 当I';我在加正数?,c++,C++,我得到了一个函数,它计算给定整数的阶乘: long iterFact(long number) { long factorial = 1; for (long i = 1; i <= number; i++) factorial *= i; return factorial; } long iterFact(长数字){ 长阶乘=1; 对于(long i=1;i您不是在添加数字,而是在将它们相乘。实际上,您不是在计算斐波那契序列,而是在计算阶乘;

我得到了一个函数,它计算给定整数的阶乘:

long iterFact(long number) {
    long factorial = 1;

    for (long i = 1; i <= number; i++)
        factorial *= i;

    return factorial;
}
long iterFact(长数字){
长阶乘=1;
对于(long i=1;i您不是在添加数字,而是在将它们相乘。实际上,您不是在计算斐波那契序列,而是在计算阶乘;-)

阶乘增长非常快:20!(
2432902008176640000
)不适合系统上的
long
(32位,可能是Windows),因此其中一个乘法会导致算术溢出,C标准明确将其描述为未定义行为。在您的系统上,计算可能以模2^32执行,结果可能是负数,但该标准不能保证这一点


切换到类型
unsigned long long
,它保证至少有64位,将允许您计算
20!
,但很快就会失败,因为
21!
。事实上
2432902008176640000
略小于2^63-1,所以类型
long long
也就足够了。

我假设您指的是阶乘,而不是阶乘斐波那契序列


在大多数现代系统中,
int
long
都是32位,最多可以代表20亿左右的数字。20阶乘大约是20亿。尝试使用64位的
long-long

这是一个整数溢出;因为变量是有符号的,而且符号位是最重要的一位,所以在有些时候你的变量溢出了。实际上,20!是一个巨大的数字。你应该尝试将变量声明为无符号长,并将其打印为无符号长。

如果
sizeof(long)
是4个字节,LONG\u MAX是2^31-1,那么当你计算
13!
时就会有整数溢出。有符号整数溢出是指你可以使用不同的数据类型,比如
uintmax\u t
,它可以容纳更大的数字,但仍然不足以处理更大的阶乘

看一看


另外:

这是签名类型的溢出

int可以是4个字节:-2147483648/2147483647

long可以是8个字节:-9223372036854775808/9223372036854775807


int/long可以是有符号和无符号的

整数溢出。此外,它是阶乘而不是斐波那契。因为阶乘增长迅速并突破了整数限制。“我认为这可能是因为数字太长了,但即使将所有内容从int改为long,结果仍然是负数”
long
也不是无限的。与其猜测,不如检查每个值,看看你的类型是否足够大。请看数字。
2**63
9223372036854775808
。现在
19!
121645100408832000
(较小),但
20!
2432902008176640000
(较大).你看到问题了吗?@WeatherVane:恐怕你弄错了:
2432902008176640000
9223372036854775808
小,所以它适合大多数现代系统的
long
在大多数现代商品系统上。今天开发的大多数现代系统实际上都有16位
int
。最好完全避免此类语句。感谢您的更正。随机猜测并不能解决随机猜测引起的问题。这是一种可能的解释。但作为有符号整数溢出调用s未定义的行为,还有许多其他原因。很抱歉回答得不好,我以后在回答问题之前会更加小心。感谢你的精确性,我没有意识到溢出导致了未定义的行为,我以为最重要的部分被忽略了,但最不重要的部分保持连贯性;我运行了few在我的机器上进行测试以观察结果,是的,结果中没有明显的逻辑。在OP的情况下,
long
不是64位,但可能只有32位,因此算术溢出。
int
可以是1字节或37位,等等。
int
long
都不能无符号。32位
long
不能保存<代码>2**32-1