我不明白为什么9的功率13不能给出正确的答案

时间:2018-10-09 18:47:00

标签: c

#include <stdio.h>
#include <limits.h>

int main() {
   printf("The minimum value of LONG = %ld\n", LONG_MIN);
   printf("The maximum value of LONG = %ld\n", LONG_MAX);
   printf("%ld",9*9*9*9*9*9*9*9*9*9*9*9*9);

   return(0);
}

很抱歉,我遇到了基本问题,但是尽管变量int很长,但我目前正在努力为变量分配大量数字。 9次幂13的结果为假。通常是2541865828329

输出:

minimum value of LONG = -9223372036854775808                                                                                                    
The maximum value of LONG = 9223372036854775807                                                                                                     
3540156393                                                                                                                                          

3 个答案:

答案 0 :(得分:4)

该产品实际上是int类型。您应该通过将所有乘数后缀LL来显式地将其转换为long类型。

9 * 9 .. => is of type int
9LL * 9LL .. => is of type long long

答案 1 :(得分:2)

程序实际上具有未定义的行为:

  • 由于表达式中的所有操作数均为int类型,因此结果将作为int计算。如果类型int为32位宽,则计算将导致算术溢出,其行为未定义。
  • int格式printf传递%d也具有未定义的行为,尤其是如果类型long与类型int的大小不同。

请注意,9 13 大于2 31 -1但小于2 63 -1,因此键入long ,指定为至少具有31个值位,则该值可能不够大,导致算术溢出,其行为未定义。

类型long long被指定为具有至少63个值位,因此使用此类型进行计算是安全的。

整数整型和类型转换的规则有些棘手。您可以阅读C标准的6.3节以获取详细信息,只记得对于类型intlonglong long,将使用较大操作数的类型执行计算,结果为这种类型。

所有二进制算术运算符都具有从左到右的关联性,这意味着a + b + c被评估为(a + b) + c。此规则适用于具有相同优先级的运算符,因此a * b / c被评估为(a * b) / c,在此不适用,但很有用。

从以上所述,我们可以得出这样的结论:将表达式的第一个操作数指定为类型long long就足以使用long long算术对表达式进行求值并产生类型long long的值。值9可以用强制转换long long或后缀(long long)9显式转换为9LL。请注意,9LL的混乱程度要小于9ll(小写为9 ell),后者可能被误读为911

这是一个更正的程序:

#include <stdio.h>
#include <limits.h>

int main() {
   printf("The minimum value of LONG = %ld\n", LONG_MIN);
   printf("The maximum value of LONG = %ld\n", LONG_MAX);
   printf("The minimum value of LONG LONG = %lld\n", LLONG_MIN);
   printf("The maximum value of LONG LONG = %lld\n", LLONG_MAX);
   printf("9**13 = %lld\n", 9LL * 9 * 9 * 9 * 9 * 9 * 9 * 9 * 9 * 9 * 9 * 9 * 9);
   return 0;
}

在64位OS / X上的输出:

The minimum value of LONG = -9223372036854775808
The maximum value of LONG = 9223372036854775807
The minimum value of LONG LONG = -9223372036854775808
The maximum value of LONG LONG = 9223372036854775807
9**13 = 2541865828329

在具有一致的C库的32位系统或最新的64位Windows操作系统上的输出:

The minimum value of LONG = -2147483648
The maximum value of LONG = 2147483647
The minimum value of LONG LONG = -9223372036854775808
The maximum value of LONG LONG = 9223372036854775807
9**13 = 2541865828329

答案 2 :(得分:1)

问题在于9不是long整数。您首先需要将所有9转换为long,所以请使用:

printf("%ld",9L*9L*9L*9L*9L*9L*9L*9L*9L*9L*9L*9L*9L);