Какой самый большой целочисленный тип данных в С++?
Самый большой тип данных в С++?
Ответ 1
Самый большой стандартный С++ целочисленный тип long
.
C имеет long long
, и С++ 0x тоже добавит его, и, конечно, вы можете реализовать свой собственный тип целочисленного типа, возможно, даже класс BigInt.
Но технически говоря, учитывая встроенные целочисленные типы, long
- ваш ответ.
Ответ 2
Тип данных long long
является самым большим встроенным интегральным типом данных в стандартных C99 и С++ 0x. Как и во всех других интегральных типах данных, long long
не задается точный размер в байтах. Вместо этого он определяется как как минимум 64-битное целое число. Хотя long long
не является частью официального стандарта С++, он повсеместно поддерживается в современных компиляторах. Обратите внимание, однако, что многие компиляторы для современных настольных компьютеров определяют long
и long long
как точно 64-разрядные, тогда как многие компиляторы для встроенных процессоров определяют long
как 32-битные и long long
как 64-битные (очевидно, с несколько исключений).
Если вам нужна более высокая точность или абсолютно невозможно использовать расширение языка long long
, вам придется использовать одну из библиотек C или С++, которые предназначены для работы с чрезвычайно большими или небольшими номерами.
Ответ 3
Вы можете не беспокоиться о примитивных именах, сопоставляя их с самым большим (полностью реализованным) типом в компилируемой архитектуре через <cstdint>
и его typedefs intmax_t
и uintmax_t
.
Я был удивлен, что никто не сказал об этом, но беглые исследования показывают, что он был добавлен в С++ 11, что, вероятно, объясняет отсутствие предыдущих упоминаний. (Хотя был приведен его новый примитивный/встроенный тип long long
!)
Некоторые компиляторы могут также предоставлять более крупные типы, хотя они могут содержать оговорки, например: Почему в g++ std:: intmax_t не является __int128_t?
Лично я использую cstdint
, так как вам проще быстро узнать, сколько байтов, которые я использую, вместо того, чтобы помнить, сколько бит соответствует данному примитиву, а стандарт означает, что он избегает моих типов, зависит от платформы. Кроме того, для того, что я делаю, uint8_t
быстрее и быстрее, чем бесконечно unsigned char
s!
изменить. Оглядываясь назад, я хочу уточнить: uint8_t
не гарантируется эквивалентностью unsigned char
. Конечно, это на моих машинах, и это, вероятно, тоже для вас. Но эта стандартная эквивалентность не требуется Стандартом; см.: Когда is uint8_t ≠ unsigned char? По этой причине теперь, когда мне нужен стандартный специальные способности [[un]signed] char
, я использую только это.
Ответ 4
В xmmintrin.h есть 128-битные упакованные целые числа и форматы с плавающей запятой, которые поддерживают SSE, чтобы разрешить использование регистров SSE и инструкций. Конечно, они не являются частью стандарта С++, но поскольку они поддерживаются MSVC, GCC и компилятором Intel С++, существует определенная кросс-платформенная поддержка (по крайней мере, OS X, Linux и Windows для процессоров Intel). Другие ISA имеют расширения SIMD, поэтому есть, вероятно, другие расширения для платформы/компилятора, которые поддерживают 128 или 256-битные SIMD-инструкции. Предстоящий набор команд AVX от Intel будет иметь 256-битные регистры, поэтому для этого мы должны увидеть новый набор типов данных и внутренних интерфейсов.
Они не ведут себя как встроенные типы данных (т.е. вам нужно использовать внутренние функции вместо операторов, чтобы ими манипулировать, и они работают с SIMD-операциями), но поскольку они действительно отображают 128-битные регистры на оборудовании, которое они заслуживают упоминания.
Ответ 5
boost::multiprecision::cpp_int
- произвольный целочисленный тип точности. Таким образом, в С++ нет "самого большого целочисленного типа данных". Просто самый большой встроенный тип встроенный, который AFAIK имеет long
в стандартном С++.
Ответ 6
Вы можете легко получить больший тип данных, указав свой собственный класс. Вы можете получить вдохновение из класса BigInteger в Java. Это неплохо, но это не обязательно действительное целое число, даже если оно действует точно так же, как оно.
Ответ 7
В компиляторах Borland и Microsoft __int64, вероятно, самый большой, который вы можете получить.
Ответ 8
Типы данных __int128_t и __uint128_t (unsigned __int128_t) имеют длину 128 бит, удваивают размер длинного длинного (что составляет 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 заключается в том, что не все компиляторы могут его поддерживать.