为什么这个函数不超过2 ^ 31的值?

时间:2012-01-02 15:51:54

标签: c++ long-integer bit pow exponent

电源功能(用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

因此,我的longint看起来都是32位。更多的游戏表明intmax_t类型也是64位。实际上每个PDT的上限为64位,所以如果我需要表示一个128位整数,那么c ++是否有内置类(类似于Java中的BigInteger)?

4 个答案:

答案 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。