电源功能(用c ++编写)......
long power (long a, long b){
long result=1l;
for (int i = 0;i<b;i++){
result*=a;
}
return result;
}
现在我做一些输出测试...
cout<<power(2l,2l)<<endl;
cout<<power(2l,4l)<<endl;
cout<<power(2l,31l)<<endl;
cout<<power(2l,32l)<<endl;
cout<<power(2l,61l)<<endl;
输出:
4
16
-2147483648
0
0
好吧,长期回落到32位大小似乎有些问题(而不是保持64位)。我想知道为什么这不起作用,但如果我使用long long
类型,一切正常。
一些额外信息:
我正在使用C ++和编译器MinGW
我正在运行64位操作系统(Windows 7)
更新
你们真棒!从来没有想过会发生这种事情。
我刚刚使用sizeof
检查了一些任意的PDT,这就是我发现的......
cout<<sizeof(long)<<" "<<sizeof(int)<<" "<<sizeof(char)<<" "<<sizeof(long long)<<" "<<sizeof(uint64_t)<<endl;
输出:
4 4 1 8 8
因此,我的long
和int
看起来都是32位。更多的游戏表明intmax_t类型也是64位。实际上每个PDT的上限为64位,所以如果我需要表示一个128位整数,那么c ++是否有内置类(类似于Java中的BigInteger
)?
答案 0 :(得分:6)
显然,您的环境中类型long
为32位。
为了解决类似的问题,我建议您使用类似uint64_t
的类型,而不是依赖于本机类型具有特定大小的假设。
修改的
回答你的第二个问题(c ++有128位整数的内置类吗?):不,它没有。或者更确切地说,它并不强制要求一个。但是,如果某个实现提供了一个实现,则可以使用uint128_t
之类的内容。就个人而言,我还没有看到任何这样做的系统。但是,有GMP等第三方库提供了这种功能。
答案 1 :(得分:1)
一个。尝试跑步:
cout<<sizeof(long);
要看到它是32位。
B中。我想这是项目定义的问题。即使您在64位机器上工作,它也可以编译32位程序,因此您可以在32和64机器上使用它。 而long总是指针的大小...
℃。 uint64_t
是最佳做法。
答案 2 :(得分:0)
在C ++和C中,int
的大小依赖于体系结构,这一切都是正确的,但是这个问题是32位带符号的int
介于-2 ^之间31和(2 ^ 31-1),不 2 ^ 31。你确实溢出了一个32位的数字。您应该使用unsigned int
代替。介于0和(2 ^ 32-1)之间。
答案 3 :(得分:0)
long long类型需要32位,因此最大正值为4294967296-1。但是你的函数计算值5842587018385982521381124421 = 21 ^ 21。