C++里有普通的 32 位整数类型 int 和 64 位整数类型 long long,但是如果我们要存一个128位的整数,前两个似乎就无能为力了。这时候我们就要用到 __int128这种类型了。

大小

32 位整数 int 类型的范围是 -2147483648 到 2147483647,也就是 $-2^{31}$ 到 $2^{31}-1$。

64 位整数 long long 类型范围是 $-2^{63}$ 到 $2^{63}-1$。

那么 __iint128 类型的范围当然就是 $-2^{127}$ 到 $2^{127}-1$。当然这是个很大的数字了。
(我依稀记得,在 Pascal 下 128 位整数(不带符号)是qword……)

定义

对__int128 类型变量的定义与普通类型没有差别:

const __int128 x=312473910479474312;
__int128 a,b;

读入与输出

默认的 cin 和 cout 都是没法读入或者输出 __int128 类型的,都会报错。printf 里面似乎也没有 __int128 类型对应的编码,那么怎么办呢?最好的方法是自己写输出函数:

inline void write(__int128 x){
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

用递归的方式,不需要另开空间存,很方便。

关于编译错误

据说在许多版本 gcc/g++ 里直接开 __int128 会编译错误(但是我在 Linux 下并没有遇到),但是在各大 OJ 的评测机上是不会出问题的。可以用洛谷的在线 IDE 尝试编译。