C++ 关于int128在何种环境下能够使用

C++ 专栏收录该内容
11 篇文章 0 订阅

今天看到有int128这种神奇的大整数类型,“可能“让我们的大整数相加变得简单些,但是自己用gcc编译了一下,失败了。不死心VS2017也失败了,网上说,只有在某些情况能够使用。做了个测试,发现只有在Linux环境下能够使用

下面是我搜集的资料和做的实验,记录一下:

C99官方文档:(511页)

J.5.6 Other arithmetic types
Additional arithmetic types, such as __int128 or double double, and their
appropriate conversions are defined (6.2.5, 6.3.1). Additional floating types may have
more range or precision than long double, may be used for evaluating expressions of
other floating types, and may be used to define float_t or double_t.

C11官方文档:(580页)

J.5.6 Other arithmetic types
Additional arithmetic types, such as __int128 or double double, and their
appropriate conversions are defined (6.2.5, 6.3.1). Additional floating types may have
more range or precision than long double, may be used for evaluating expressions of
other floating types, and may be used to define float_t or double_t. Additional
floating types may also have less range or precision than float.

两段一模一样,大概意思是C标准中未对__int128这个类型做准确的定义,只是留有这样的一个定义,具体实现由编译器构成。
也就是说,这个类型能不能使用完全取决于你使用的编译器是什么。反正我C标准没由具体实现。
那么我对三段测试代码做了如下实验:

测试代码1#include <iostream>
using namespace std;
int main(void){
        __int128 a;
        return 0;
}
测试代码2#include <iostream>
using namespace std;
int main(void){
        __int128_t a;
        return 0;
}
测试代码3#include <iostream>
using namespace std;
int main(void){
        __uint128_t a;
        return 0;
}

Ubuntu18.04:

gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0

测试代码1或2或3:

g++ -o test test.cpp 编译成功
g++ -o test test.cpp -std=c++11编译成功

Windows 10:

gcc (MinGW.org GCC-6.3.0-1) 6.3.0

测试代码1或2或3:

g++ -o test test.cpp 编译失败
g++ -o test test.cpp -std=c++11编译失败

看来我们只能在Linux环境下使用__int128了。

但是cincout都无法输出__int128的,我们需要自己写个读入输出,下面我贴个模板:

#include <bits/stdc++.h>
using namespace std;
inline __int128 read(){
    __int128 x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}

inline void print(__int128 x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9)
        print(x/10);
    putchar(x%10+'0');
}

int main(void){
    __int128 a = read();
    __int128 b = read();
    print(a + b);
    cout<<endl;
    return 0;
}

输入输出如下:

root@ubuntu:~# g++ test.cpp -o test
root@ubuntu:~# ./test
1 2
3

  • 6
    点赞
  • 6
    评论
  • 21
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值