#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
答案 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节以获取详细信息,只记得对于类型int
,long
和long 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);