В большинстве задач нам хватает вместительности long long
(64 бита), но в некоторых задачах приходится писать длинную арифметику, однако есть и те, в которых хватит 128 бит, именно поэтому в C++ существует тип __int128
. Если вы используете Microsoft Visual Studio, то забудьте про него, его там нет). Теперь расскажу про его особенности:
- существует как знаковый
__int128
(от $$$-2^{127}+1$$$ до $$$2^{127}-1$$$, что примерно от $$$-10^{38}$$$ до $$$10^{38}$$$) так и беззнаковыйunsigned __int128
(от $$$0$$$ до $$$2^{128}-1$$$, что примерно $$$3*10^{38}$$$)
с ним можно делать все те же арифметические операции
+ - * / % += -= *= /= %= ++ --
, битовые операции| & ^ << >>
, а также сравнивать< > <= >= == !=
можно использовать и функции
abs(), sqrt(), swap()
его можно перевести в
long long, int, short
, то есть если__int128 a
то можно сделатьlong long(a), int(a), short(a)
, и наоборот если естьlong long a
илиint a
илиshort a
то можно написать__int128(a)
Его нельзя считать или вывести с помощью
cout cin
, но ниже я привел код чтобы это было делать можно)к великому сожалению написать
a = 123456789123456789123456789
не получится придётся либо строку переводить в число либо писать извращённоa = 12345678912345, a = a * 10000000000000 + 6789123456789;
советую использовать
using lll = __int128
иusing ull = unsigned __int128
Happy coding!)