C++ c++;可以存储2^63吗?
我需要在我的程序中存储2^63个自然数。Int有4个字节:所以它是2^(8*4)=2^32,我应该使用哪种类型?在大多数现代处理器上,一个C++ c++;可以存储2^63吗?,c++,C++,我需要在我的程序中存储2^63个自然数。Int有4个字节:所以它是2^(8*4)=2^32,我应该使用哪种类型?在大多数现代处理器上,一个长Int。从技术上讲,这是C99/C++ 11的新技术,但大多数C++编译器都支持自从99年以来。 常量的形式是0LL您可以使用unsigned long-long,但我会检查您的编译器是否支持该类型 #include <iostream> int main() { std::cout<<sizeof(unsigned long
长Int
。从技术上讲,这是C99/C++ 11的新技术,但大多数C++编译器都支持自从99年以来。
常量的形式是
0LL
您可以使用unsigned long-long
,但我会检查您的编译器是否支持该类型
#include <iostream>
int main()
{
std::cout<<sizeof(unsigned long long)<< " bytes" << std::endl;
return 0;
}
#包括
int main()
{
Std::CUT< P>这是依赖于体系结构的。C++没有C的代码>代码> ST>。
我认为C++11添加了cstdint
作为stdint.h
的包装。然后您可以使用int64\u t
编辑:正如johannes指出的那样,long
在Windows中是32位的。我不确定这在C++03中是否可以在保持完全符合标准的情况下进行移植。long
和int64_t
不是C++03标准的一部分,而是由普通编译器作为编译器扩展提供的。您可以使用
它还有一个
注:
GMP中的C++支持可以通过--enable cxx'启用,在这种情况下
将需要C++编译器。作为一个方便的< /COD> >启用CXX=检测
只有在找到编译器时才能使用C++支持。
C++支持由一个库LBGMPXX.LA和头文件GMPX.H组成。
(请参见标题和库)
\uu int64
和long
经常使用,但不是STL的一部分。
如果不支持\uuu int64
,C的long
将与GCC一起使用。
在C99中,如果您需要正好64位,您可以使用int64\t
,从查看*\u MAX
中为编译器定义的limits.h
常量。如果其中任何一个大于等于2^63,请使用该常量对应的类型。对于我的编译器,ULLONG\u MAX
是0xffffffffffffffffffffffff64
或18446744073709551615
,这是>=9223372036854775808
(2^63)。因此,我会使用无符号long-long
作为将自然数保存到2^63的类型。我不知道这是否有用,但double能够准确地表示pow(2,63)值(没有错误)。但是,它不能表示pow(2,63)正是+1.0,也不能表示pow(2,63)-1.0,所以这可能不是一个有用的答案
因此,如果您确实需要它的整数表示,那么需要使用无符号64位整数类型(有符号类型是不够的,因为(1我建议使用大整数库)
这是一个有效的公共域:\include
使用名称空间std;
int main()
{
无符号长结果=1;
对于(int i=1;i什么平台?有符号还是无符号?您可能有'long long'或'int64_t'。请检查此项。不,您没有。如果是这样,请告诉我为什么?请注意,int不能保证为4字节…它只是我能想到的每一个现代桌面。所有整数类型都可以存储2^63
(等于61):p.我认为ll后缀不区分大小写。我从来不知道。还更改了常量。Point也会使用较小的数字。win64上的long是32位。Unix/Linux上的long是64位。编写可移植代码时的一个烦恼。正如其他人提到的long long,如果支持的话,这是最好的方法。(C++11中新增)你的意思是long-long
。在Windows上,long
在Windows中是32位。更正。我应该停止对Windows进行假设,因为它似乎总是违背我的期望。@OscarKorz,这就是限制的原因。h公开long_MAX
和ULONG_MAX
,这样你可以验证你的假设。请添加一些解释我在上面写的一个小程序,它可以存储(2^64)-1个十进制数,也就是18446744073709551615,它在2^63以上。
#include <iostream>
using namespace std;
int main()
{
unsigned long long result = 1;
for(int i = 1; i <= 64; i++){
if(i == 64){
result = ((result * 2)-1);
}
else{
result = ((result * 2));
}
}
cout << "result is : " << result << endl;
return 0;
}