ideas icon indicating copy to clipboard operation
ideas copied to clipboard

int128_t, int256_t,..

Open apolukhin opened this issue 4 years ago • 2 comments

Перенос предложения: голоса +34, -2 Aвтор идеи: Клеванец Игорь

Текущий стандарт описывает знаковые и беззнаковые типы 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.

apolukhin avatar Mar 15 '21 10:03 apolukhin

f03n1x, 16 декабря 2016, 15:23 Я бы предложил еще предоставить возможность использования типов с неограниченной точностью.

yndx-antoshkka, 19 декабря 2016, 20:59 f03n1x, это отдельный proposal http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4038.html , мы им не занимаемся. Но при желании, вы можете предложить свою помощь авторам.

Anatoly Scheglov, 27 декабря 2016, 17:16 Ключевое слово "иногда". По сравнению с другими стандартными библиотеками (строки, алгоритмы, etc) необходимость в такой библиотеке исчезающе мала.

yndx-antoshkka, 14 февраля 2017, 17:08 Есть сразу два предложения на тему:

  • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0104r1.html
  • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0539r0.html

Кому какие предложения больше нравятся и почему? Передам ваши соображения на заседании.

apolukhin avatar Mar 15 '21 10:03 apolukhin

Подгруппа SG6 работает крайне медленно, дело не движется

К счастью, C23 добавляет _BitInt. А значит в C++ функционал приедет из C.

apolukhin avatar Oct 22 '23 10:10 apolukhin