关于C/C++中的__int128
LZC Lv4

关于C/C++中的__int128

数据类型 占用空间(字节) 取值范围 常见数据范围
short 2 (2152151)(-2^{15}\sim2^{15}-1) /
int 4 (2312311)(-2^{31}\sim2^{31}-1) 1e9
long 4 (2312311)(-2^{31}\sim2^{31}-1) 1e9
long long 8 (2632631)(-2^{63}\sim2^{63}-1) 1e18

我们知道long long最大能表示到大约1e18这个数量级,但如果给的数据>=1e19呢?

__int128这个数据类型即可解决这个问题。

__int128是什么?

__int128是128位的整型,大概是1e38的范围。


__int128有什么用?

处理大数。


__int128怎么用?

__int128并不是所有的编译器都可以使用,但在Linux系统上是可以编译使用的。因为大部分比赛(蓝桥杯除外)和OJ的评测机都是建立在Linux上,所以做题的时候也可以用。

定义:

1
__int128 a;

输入输出不能使用cin/cout和scanf/printf,需要写一个按位输入输出的函数(快读快写)

输入函数:

1
2
3
4
5
6
7
inline __int128 read()
{
__int128 x = 0,f = 1;char c = getchar();
while(!isdigit(c)) if (c == '-') f = -1,c = getchar();
while(isdigit(c)) x = (x << 1) + (x << 3) +(c ^ 48),c = getchar();
return x * f;
}

输出函数:

1
2
3
4
5
6
inline void write(__int128 x)
{
if (x < 0) putchar('-'),x = -x;
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
}

输入输出方法:

1
2
a = read();
write(a)

__int128类型与int类型一样可以进行算术运算。

在确定范围超过long long但不超过__int128时,用__int128可以极大的方便运算,但超过1e38时,还是需要打高精度板子。