c ++中最大的整数数据类型是什么?
答案 0 :(得分:21)
最大的标准 C ++整数类型为long
。
C有long long
,C ++ 0x也会添加它,当然你可以实现自己的自定义整数类型,甚至可能是BigInt类。
但从技术上讲,考虑到内置的整数类型,long
就是你的答案。
答案 1 :(得分:9)
long long
数据类型是标准C99和C ++ 0x中最大的内置整数数据类型。与所有其他整数数据类型一样,long long
没有给出精确的字节大小。相反,它被定义为至少 64位整数。虽然long long
不是官方C ++标准的一部分,但它在现代编译器中得到了普遍支持。但请注意,现代桌面的许多编译器都将long
和long long
定义为64位,而嵌入式处理器的许多编译器将long
定义为32位和{{1}作为64位(显然有少数例外)。
如果您需要更高的精度或绝对不能使用long long
语言扩展,那么您将不得不使用一个旨在处理极大或极小数字的C或C ++库。
答案 2 :(得分:7)
您可能希望通过<cstdint>
及其typedef intmax_t
和uintmax_t
映射到编译体系结构中的最大(完全实现)类型来避免担心原始名称。
我很惊讶没有人说过这个,但粗略的研究表明它是在C ++ 11中添加的,这可能解释了之前提到的缺乏。 (虽然它的新原语/内置类型long long
被引用了!)
某些编译器也可能提供更大的类型,但这些类型可能带有警告,例如:Why in g++ std::intmax_t is not a __int128_t?
就个人而言,我正在使用cstdint
,因为它更容易快速查看我使用的最小字节数 - 而不是必须记住给定基元对应的位数 - 标准意味着它避免了我的类型是平台依赖的。另外,就我所做的而言,uint8_t
比无尽的unsigned char
更快更整洁!
修改:事后看来,我想澄清一下:uint8_t
不能保证等同于unsigned char
。当然,它在我的机器上,它也可能适合你。但标准并不要求这种等同性;请参阅:When is uint8_t ≠ unsigned char?因此,现在当我需要标准定义的[[un]signed] char
特殊能力时,我只使用它。
答案 3 :(得分:4)
在编译器的xmmintrin.h中定义了128位打包整数和浮点格式,支持SSE以使能SSE寄存器和指令。它们当然不是C ++标准的一部分,但由于它们得到MSVC,GCC和英特尔C ++编译器的支持,因此有一定程度的跨平台支持(至少OS X,Linux和Windows用于Intel CPU)。其他ISA具有SIMD扩展,因此可能存在支持128或256位SIMD指令的其他平台/编译器特定扩展。英特尔即将推出的AVX指令集将具有256位寄存器,因此我们应该看到一组新的数据类型和内在函数。
它们的行为与内置数据类型不同(即,您必须使用内部函数而不是运算符来操作它们,并且它们与SIMD操作一起工作)但是因为它们实际上映射到128位寄存器在硬件上他们值得一提。
答案 4 :(得分:3)
boost::multiprecision::cpp_int
是一个任意精度整数类型。所以C ++中没有“最大整数数据类型”。只是一个最大的内置整数类型,AFAIK在标准C ++中是long
。
答案 5 :(得分:2)
您可以通过定义自己的类轻松获得更大的数据类型。 您可以从Java中的 BigInteger 类中获得灵感。这是一个很好的,但它不一定是一个实际的整数,即使它完全像一个整数。
答案 6 :(得分:0)
在Borland和Microsoft编译器中,__ int64可能是你能获得的最大值。
答案 7 :(得分:0)
__int128_t和__uint128_t(无符号__int128_t)数据类型是128位长,是长long的两倍(对于c ++新手来说,长度为64位)。但是,如果您要使用它们,那么您需要进行一些重载,因为int128数据类型不太受支持(至少在Mingw中)。这是一个如何使用它来显示2 ^ x-1直到2 ^ 128-1
的示例#include <iostream>
char base10_lookup_table[10]={'0','1','2','3','4','5','6','7','8','9'};
std::ostream&
operator<<( std::ostream& dest, __int128 value )
{
std::ostream::sentry s( dest );
if ( s ) {
__uint128_t tmp = value < 0 ? -value : value;
char buffer[ 128 ];
char* d = std::end( buffer );
do
{
-- d;
*d = base10_lookup_table[ tmp % 10 ];
tmp /= 10;
} while ( tmp != 0 );
if ( value < 0 ) {
-- d;
*d = '-';
}
int len = std::end( buffer ) - d;
if ( dest.rdbuf()->sputn( d, len ) != len ) {
dest.setstate( std::ios_base::badbit );
}
}
return dest;
}
std::ostream&
operator<<( std::ostream& dest, unsigned __int128 value )
{
std::ostream::sentry s( dest );
if ( s ) {
__uint128_t tmp = value < 0 ? -value : value;
char buffer[ 128 ];
char* d = std::end( buffer );
do
{
-- d;
*d = base10_lookup_table[ tmp % 10 ];
tmp /= 10;
} while ( tmp != 0 );
if ( value < 0 ) {
-- d;
*d = '-';
}
int len = std::end( buffer ) - d;
if ( dest.rdbuf()->sputn( d, len ) != len ) {
dest.setstate( std::ios_base::badbit );
}
}
return dest;
}
int main ( void )
{
__uint128_t big_value = 0; //unsigned int128
for ( unsigned char i=0; i!=129; ++i ) //I am using an unsigned char because it can hold all the values that will be used
{
std::cout << "1 less than 2 to the power of " << int(i) << " = \0" << big_value << "\n";
big_value |= (__uint128_t)1 << i;
}
return 0; //formal way of exiting
}
int128数据类型的问题在于并非所有编译器都支持它。