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

Jim*_*uch 2 c++ bit exponent pow long-integer

电源功能(用c ++编写)......

long power (long a, long b){
    long result=1l;
    for (int i = 0;i<b;i++){
        result*=a;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

现在我做一些输出测试......

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;
Run Code Online (Sandbox Code Playgroud)

输出:

4
16
-2147483648
0
0
Run Code Online (Sandbox Code Playgroud)

好吧,似乎有一些问题,长期回落到32位大小(而不是保持64位).我想知道为什么这不起作用,但如果我使用该long long类型,一切正常.

一些额外的信息:

我正在使用C++和编译器MinGW
我运行的是64位操作系统(Windows 7)

更新:

你们真棒!从没想过会发生这种事情.

我刚刚检查了一些任意的PDT sizeof,这就是我发现的......

cout<<sizeof(long)<<" "<<sizeof(int)<<" "<<sizeof(char)<<" "<<sizeof(long long)<<" "<<sizeof(uint64_t)<<endl;
Run Code Online (Sandbox Code Playgroud)

输出:

4 4 1 8 8
Run Code Online (Sandbox Code Playgroud)

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

Lin*_*cer 6

显然,long您的环境中的类型是32位.

为了解决类似的问题,我建议您使用类型uint64_t而不是依赖于本机类型具有特定大小的假设.

编辑

回答你的第二个问题(c ++有128位整数的内置类吗?):不,它没有.或者更确切地说,它并不强制要求一个.但是,如果一个实现提供了一个,你就可以使用类似的东西uint128_t.就个人而言,我还没有看到任何这样做的系统.但是,有像GMP这样的第三方库提供了这种功能.