在 C++ 里,标准并未直接提供__int128_t
类型,不过部分编译器(像 GCC 和 Clang)对其进行了扩展,这是一种 128 位的整数类型。该类型可处理远超long long
范围的整数。下面为你介绍__int128_t
的具体用法:
1. 声明与初始化
#include <iostream>
int main() {
// 声明一个 __int128_t 类型的变量
__int128_t num1;
// 初始化
__int128_t num2 = 12345678901234567890;
return 0;
}
2. 基本运算
__int128_t
类型支持常见的算术运算,如加、减、乘、除等。
#include <iostream>
int main() {
__int128_t a = 12345678901234567890;
__int128_t b = 9876543210987654321;
__int128_t sum = a + b;
__int128_t difference = a - b;
__int128_t product = a * b;
__int128_t quotient = a / b;
return 0;
}
3. 输入输出
由于 C++ 标准库没有直接支持__int128_t
类型的输入输出,所以得自定义函数来实现。
可以将_int128_t的输入输出利用字符串的输入输出来实现。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
//构造__int128_t的输入和输出
__int128_t read(){
__int128_t result=0;
string s;
bool flag=false; //标记是不是负数
int i=0; //字符串下标
cin>>s;
if(s[i]=='-'){
flag=true;
i=1;
}
for(;i<s.size();i++){
result=result*10+(s[i]-'0');
}
if(flag) result*=-1;
return result;
}
void print(__int128_t num){
string s="";
while(num){
s+=char('0'+num%10);
num/=10;
}
reverse(s.begin(),s.end()); //翻转一下
cout<<s<<endl;
}
signed main(){
__int128_t num=read();
print(num);
return 0;
}
注意事项
- 可移植性:
__int128_t
属于编译器扩展,并非 C++ 标准的一部分,因此在不支持该扩展的编译器上无法使用。 - 输入输出:标准库没有直接支持
__int128_t
类型的输入输出,所以需要自定义函数来处理。 - 性能:相较于普通整数类型,
__int128_t
类型的运算可能会更慢,因为它需要更多的处理资源。
这里补充介绍一下 reverse(s.begin() , s.end()) 函数,reverse是翻转函数,和fill函数一样,它的参数是迭代器或者指针,第一个参数是需要接受操作的第一个指针位置或者第一个迭代器,第二个参数是需要接受操作的最后一个指针位置+1 或者 最后一个迭代器位置+1 。