int128_t, int256_t,..

Клеванец  Игорь
Клеванец Игорь

Текущий стандарт описывает знаковые и беззнаковые типы int8_t, int16_t, int32_t, int64_t. Обычно их достаточно для ежедневной работы, но иногда появляется потребность в больших числах: криптография, IPv6, ооочень большие счётчики. Существует нестандартный тип __in128 в gcc и clang, который подтверждает необходимость таких числах. Но сейчас не существует удобного кросс-платформенного решения. К тому же хочется не только int128, но и int256, int512 и т.д.

Хочется, чтобы интерфейс был идентичен интегральным типам. Например:

constexpr int128_t c = std::numeric_limits<int128_t>::min();
static_assert(c == 0x80000000000000000000000000000000_uint128);

int256_t a = 13;
a += 0xFF;
a *= 2.0;
a -= 12_int128;
assert(a > 0);

Делать int с произвольным количеством бит фундаментальным типом на уровне языка проблематично.

Зато вполне реализуемо в рамках стандартной библиотеки:

 

template<size_t Bytes, bool Signed> class wide_int;

using uint128_t = wide_int<16, false>;

Proof of concept можно найти здесь: https://github.com/cerevra/int/tree/master/v2.

Текст самого proposal: https://cerevra.github.io/int.

 

20
рейтинг
4 комментария
f03n1x
Я бы предложил еще предоставить возможность использования типов с неограниченной точностью.
f03n1x
yndx-antoshkka
f03n1x, это отдельный proposal open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4038.html , мы им не занимаемся. Но при желании, вы можете предложить свою помощь авторам.
yndx-antoshkka
Anatoly Scheglov
Ключевое слово "иногда". По сравнению с другими стандартными библиотеками (строки, алгоритмы, etc) необходимость в такой библиотеке исчезающе мала.
Anatoly Scheglov
yndx-antoshkka
Есть сразу два предложения на тему:
* open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0104r1.html
* open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0539r0.html

Кому какие предложения больше нравятся и почему? Передам ваши соображения на заседании.
yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).