Подтвердить что ты не робот

Самый большой тип данных в С++?

Какой самый большой целочисленный тип данных в С++?

4b9b3361

Ответ 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-битные регистры на оборудовании, которое они заслуживают упоминания.

Сведения о потоковом расширении SIMD Extension (SSE)

Ответ 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 заключается в том, что не все компиляторы могут его поддерживать.