2

幂函数(用 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)

更新:

你们真棒!从来没想过会发生这样的事情。

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

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++ 是否有一个内置类(类似于BigIntegerJava 中的东西)?

4

4 回答 4

6

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

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

编辑

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

于 2012-01-02T15:54:49.617 回答
1

A. 尝试运行:

cout<<sizeof(long);

看到它是32位的。

B. 我猜是你项目的定义有问题。即使您在 64 位机器上工作,它也可以编译 32 位程序,因此您可以在 32 位和 64 位机器上使用它。
并且 long 始终是指针的大小......

C.uint64_t是最佳实践。

于 2012-01-02T15:56:24.950 回答
0

在 C++ 和 C 中,大小int取决于体系结构,这都是正确的,但问题是 32 位有符号int' 介于 -2^31 和 (2^31-1) 之间,而不是2^ 31. 您确实溢出了一个 32 位数字。您应该改用 an unsigned int。介于 0 和 (2^32-1) 之间。

于 2012-01-02T15:56:01.523 回答
0

Well long 类型占用 32 位,因此最大正值为 4294967296-1。但是您的函数计算值 5842587018385982521381124421=21^21。

于 2012-01-02T16:02:27.040 回答