long不一定比int长,在x86 32位或者64位Windows下long和int的长度是一样的,都是32位。
而在大部分ARM 64位系统下,比如iOS、Android下,long和long long等价,都是64位的,而int则是32位的。
因此你第三个函数里面,使用long这个数据类型,结果是不跨平台的。为什么你会这么写?你可能参考了谭浩强C教材上的写法,他的很多东西还是16位DOS系统时代的,DOS下的C编译器一般int是16位,long是32位。
为什么手机上正确执行,因为你的手机大概率是基于64位ARM Linux的Android系统,这个系统上long长度是64位的,你的那个乘方函数里面稍微多乘几次也不会发生溢出。你在Windows上得不到正确的结果,是因为Windows上long长度只有32位,乘方函数计算中途很快就溢出了。
如果你第三个函数用long long替代long,应该在两个平台上都能得到正确结果。
#include <stdio.h> double kesegi(int a, int b); long long prime(int a, int b); int main() { printf("%f", kesegi(3,20)); } double kesegi(int a, int b) { double num; num = a * (1LL - prime(a,b)) / (1 - a); return num; } long long prime(int a, int b) { int n; long long num=1; for (n = 1; n <= b; ++n) { num = a * num; } return num; }
如果你能使用C99,建议用<stdint.h>里面的int64_t来代替long,int32_t来代替int,这些变量的长度在所有系统下都是确定的,这样跨平台性好得多。