分类
Level3

__int128

在C++中,__int128是一种扩展的整数类型,它提供了128位的整数支持。需要注意的是,__int128并不是C++标准的一部分,而是GCC和Clang等编译器提供的扩展。
一、你可以像使用其他整数类型一样声明__int128变量。如:
__int128 a = 123456789;
二、初始化:由于大多数编译器不支持直接输入128位整数(例如通过字面量),所以通常需要通过其他方式初始化,比如使用字符串转换函数,或者通过运算得到。
__int128 b = (__int128)1000000000 * 1000000000;
三、输入输出:标准输入输出流(如cin/cout)不直接支持__int128。因此,你需要自己实现输入输出函数。通常的做法是将数字转换为字符串,然后输出,或者按字节处理。输出示例:
void print(__int128 x) {
    if (x < 0) { putchar(‘-‘); x = -x; }
    if (x > 9) print(x / 10);
    putchar(x % 10 + ‘0’);
}
注意:上面输出使用的是递归方式,也可以使用循环。另外,对于负数取负时要注意最小值的问题(__int128的最小值取负会溢出)。
四、算术运算:__int128支持所有基本的算术运算(加、减、乘、除、取模)以及位运算。这些操作与64位整数类似。
__int128 a = 100, b = 200;
__int128 c = a + b;
__int128 d = a * b;
__int128 e = a / b;
__int128 f = a % b;
五、比较运算:同样支持所有比较运算符(==, !=, <, >, <=, >=)。
if (a < b) { … }
六、类型转换:可以隐式或显式地在__int128和其他整数类型之间转换。但是,当将大数赋给较小的类型时,可能会丢失数据。
long long ll = 123456789012345678LL;
__int128 i128 = ll; // 隐式转换
long long ll2 = (long long)i128; //显式转换,如果i128超出ll范围则结果不确定
七、常量:不能直接写128位的整数字面量。如果需要一个常量,可以通过计算得到。

#include<iostream> //示例代码
using namespace std;
void print(__int128 x) {
    if (x < 0){ 
	putchar('-');  
	x = -x; 
    } 
    if (x > 9)  print(x / 10);
    putchar(x % 10 + '0');
}
const __int128 big = (__int128)1 << 65; //正确赋值
const __int128 err = 123456789123456789123456789;//错误的赋值
int main(){
    print(big); cout << endl;//常量输出
    print(err); cout << endl;//数据是错误的
    __int128 a = 123456789;
    __int128 b = 987654321;
    __int128 c = a * b;//乘法示例
    cout << "a = "; print(a); cout << endl;
    cout << "b = "; print(b); cout << endl;
    cout << "c = a * b = "; print(c); cout << endl;
    __int128 d = (__int128)1000000000000000000 * 1000000000000000000;
    cout << "d = "; print(d); cout << endl;
    __int128 e = d / a;// 除法示例
    cout << "e = d / a = "; print(e); cout << endl;
    __int128 f = d % a;// 模运算示例
    cout << "f = d % a = "; print(f); cout << endl;
    return 0;
}

__int128可以解决一些大数据的问题,但是如果数据更大,那么需要使用高精度算法/大数据处理算法