int128_t, int256_t,..
Перенос предложения: голоса +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.
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
Кому какие предложения больше нравятся и почему? Передам ваши соображения на заседании.
Подгруппа SG6 работает крайне медленно, дело не движется
К счастью, C23 добавляет _BitInt. А значит в C++ функционал приедет из C.