【发布时间】:2010-11-27 21:01:24
【问题描述】:
c++ 中最大的整数数据类型是什么?
【问题讨论】:
标签: c++
c++ 中最大的整数数据类型是什么?
【问题讨论】:
标签: c++
__int128_t 和 __uint128_t (unsigned __int128_t) 数据类型的长度为 128 位,是 long 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 数据类型的问题在于并非所有编译器都支持它。
【讨论】:
您可能更愿意通过<cstdint> 及其类型定义intmax_t 和uintmax_t 映射到编译架构上最大的(完全实现的)类型来避免担心原始名称。
我很惊讶没有其他人这么说,但粗略的研究表明它是在 C++11 中添加的,这可能可以解释之前没有提及的原因。 (虽然它的同伴新的原始/内置类型long long 被引用了!)
一些编译器也可能提供更大的类型,尽管这些可能带有警告,例如:Why in g++ std::intmax_t is not a __int128_t?
就我个人而言,我使用cstdint,因为它更容易快速查看我正在使用的最小字节数 - 而不必记住给定原语对应于多少位 - 标准意味着它避免了我的类型平台相关。另外,就我所做的而言,uint8_t 比无尽的unsigned chars 更快更整洁!
编辑:事后看来,我想澄清一下:uint8_t 不保证等同于unsigned char。当然,它在我的机器上,它可能也适合你。但是标准不要求这种等效性;见:When is uint8_t ≠ unsigned char? 正因如此,现在当我需要[[un]signed] char 的标准定义特殊能力时,我只使用它。
【讨论】:
boost::multiprecision::cpp_int 是任意精度整数类型。所以在 C++ 中没有“最大的整数数据类型”。只是最大的 builtin 整数类型,AFAIK 在标准 C++ 中是 long。
【讨论】:
long long 数据类型是标准 C99 和 C++0x 中最大的内置整数数据类型。与所有其他整数数据类型一样,long long 没有以字节为单位给出确切的大小。相反,它被定义为至少一个 64 位整数。虽然long long 不是官方 C++ 标准的一部分,但它在现代编译器中得到普遍支持。但是请注意,许多现代桌面编译器将long 和long long 都定义为64 位,而许多嵌入式处理器的编译器将long 定义为32 位,long long 定义为64 位(显然少数例外)。
如果您需要更高的精度或绝对不能使用 long long 语言扩展,您将不得不使用专为处理极大或极小数字而设计的 C 或 C++ 库之一。
【讨论】:
long 保持为 32 位,long long 为 64 位。
long long 不在 C++ 标准中。它在 C99 中添加到 C 中。目前,它是大多数编译器都支持的无处不在的扩展。
long long存在? 它甚至在 C++ 中都不存在。它是一个 C 数据类型,是的,它将在 C++0x 中添加,但目前,它在 C++ 中不存在。 -1
最大的标准 C++整数类型是long。
C 有一个long long,C++0x 也将添加它,当然您可以实现自己的自定义整数类型,甚至可能是 BigInt 类。
但从技术上讲,考虑到内置整数类型,long 是您的答案。
【讨论】:
long long 在 C++11 中。
在支持 SSE 的编译器上,xmmintrin.h 中定义了 128 位压缩整数和浮点格式,以启用 SSE 寄存器和指令的使用。它们当然不是 C++ 标准的一部分,但由于它们受到 MSVC、GCC 和英特尔 C++ 编译器的支持,因此存在一定程度的跨平台支持(英特尔 CPU 至少支持 OS X、Linux 和 Windows)。其他 ISA 具有 SIMD 扩展,因此可能还有其他支持 128 或 256 位 SIMD 指令的平台/编译器特定扩展。英特尔即将推出的 AVX 指令集将具有 256 位寄存器,因此我们应该会看到一组新的数据类型和内在函数。
它们的行为不像内置数据类型(即,您必须使用内部函数而不是运算符来操作它们,并且它们与 SIMD 操作一起使用)但因为它们实际上映射到 128 位寄存器在他们值得一提的硬件上。
【讨论】:
您可以通过定义自己的类轻松获得更大的数据类型。 您可以从 Java 中的 BigInteger 类中获得灵感。这是一个不错的整数,但它不一定是一个实际的整数,即使它的行为与整数一模一样。
【讨论】:
在 Borland 和 Microsoft 编译器中,__int64 可能是你能得到的最大的。
【讨论】: