详解__int128,最大可用整数类型

前言:有些题目需要的数值刚好比 long long 的最大值大那么一点点,那么我们就可以用__int128 来搏一搏(并不是所有OJ都支持这个数据类型,受编译标准影响)

最大值是多少

int 最大值:2^(32-1)-1【受电脑字长影响】

long 最大值:2^(32-1)-1【不可改变】

冷知识:int 大小受电脑字长影响,早期电脑通常为16位,那么 int最大值 为:2^(16-1)-1;好一点的电脑为32位,那么 int最大值 为:2^(32-1)-1。

现在最差的电脑也有32位,一般为64位,绝大多数情况默认64位。

即目前 int最大值 皆为2^(32-1)-1,不会更大。

long long 最大值:2^(64-1)-1【不可改变】 

__int128 大小:2^(128-1)-1 【不可改变】

关于__int128:只能进行四则运算,不能用cin和cout来输出(本蒟蒻在此不做解释),不能用位运算来定义最大值。


定义最大值 / 最小值

C/C++标准中自带最大值和最小值宏定义(除了__int128,可能有,但是我没找到)

int 最大值宏 INT_MAX

long 最大值宏 LONG_MAX

long long 最大值宏 LONG_LONG_MAX

因为可以四则运算,可以 __int128 MAX = LONG_LONG_MAX * LONG_LONG_MAX 来定义最大值(2个LONG_LONG_MAX相乘最高位2^126,__int128最大值最高位2^127-1,不会溢出)

最小值就是最大值取个反,怕溢出的可以少算一点,比如 10 * LONG_LONG_MIN。


__int128的输入和输出

输入可以用string来读取,然后按位把值算进去

输出要手写,如下示例

#include <bits/stdc++.h>
using namespace std;
using maxType=__int128;

maxType a = (maxType)LONG_LONG_MAX*LONG_MAX;
void print(maxType x){
    stack<int>o;
    while(x)o.push(x%10),x/=10;
    while(!o.empty())cout<<o.top(),o.pop();
    cout<<endl;
}

int main(){
    cout<<"LONG_LONG_MAX:";
    print(LONG_LONG_MAX);
    cout<<"maxType:";
    print(a);
    return 0;
}


可能会用到的该知识点的题:[传智杯 #5 初赛] E-梅莉的市场经济学 - 洛谷

参考博文:详解__int128 - FReQuenter - 博客园(更具体,包含什么时候可以使用__int128)(看什么看,不如直接搏一搏)

猜你喜欢

转载自blog.csdn.net/qq_17807067/article/details/128062901