视频加载失败

关于__int128和short,你需要知道的一切

关于__int128和short,你需要知道的一切
915 字
5 分钟
关于__int128和short,你需要知道的一切

高精度大家都认识吧?

但是,高精度这货是真滴长……

于是,人们又发明出了一个东西 __int128!

__int128(注意前面有2个下划线)嘛,把特点写脸上了:占用128位,也就是16个字节。储存范围,自然也是占用64位的long long的2倍。换算一下,能存三十多近四十位。基本上可以代替部分高精度了。

那__int128这么NB,咋就不能被广泛使用呢(好多教材没教这个对不)?

因为它缺陷也很多:

  1. 不通用。__int128 并没有在任何一个 C艹标准中严格定义 ,所以目前它的支持情况看编译器,不过好消息是一般 GCC(包括 NOI Linux 的那个古董)在内都是支持的)。
  2. 不方便。__int128目前看来是不支持直接读入、输出的。管你是 cin、cout、scanf 还是 printf,都甭想输入一个 __int128 类型的数据。于是它需要通过快读(快写)来读入/输出。
  3. 空间大,速度慢。 __int128 占用了 16 个字节来存,MLE的风险显著增加。空间大速度还慢。你想啊,人家int 才 32 位,64 位的CPU一次处理俩;你 128 位,64 位的 CPU 两次处理 1 个,不得慢死(TLE 风险增加)……当然啦,这货肯定比高精度快得多。

不过,为了让大家多掌握(pian)亿点东(fen)西,下面给出使用 __int128 时的基本框架。

#include <bits/stdc++.h>
#define log printf
using namespace std;
__int128 n;
__int128 reader() {
__int128 x = 0; // 虽然限制那么多,但咱赋个值总还是可以的吧……
int w = 0;
char ch;
while (!isdigit(ch)) {
w |= ch == '-'; ch = getchar();
}
while (isdigit(ch))
x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
return w ? -x : x;
}
void output(__int128 x) {
if (x < 0) {
putchar('-');
x *= -1;
}
if (x > 9)
output(x / 10);
putchar(x % 10 + '0'); // 众所周知这货只能搞四则运算,输出还请数位分解一下(其实就是快读快写)
}
int main() { // 你变量全用 __int128 我也不拦着你,但永远记住 main 函数不开 int(好吧用 signed 也行,因为这货本来就是 signed int)会 CE 的哈
n = reader();
// 请自行操作
output(n);
return 0;
}

总结就是它是高精度的下位替代,相对好写很多,但也有不少缺陷——类似树状数组和线段树的关系,前者速度快、代码简单,后者速度慢但能解决更多问题,使用时各取所需即可。


说了这么半天慢的太吓人的 __int128,那有木有一个特快的,比如说 16 位 2 个字节的哪种?

还真有,而且这个槽点就没那么多了。它就是——short!

short 这玩意儿可比 __int128 强多了。它是通用的,也是可以直接读入、输出的(scanf 和 printf统一用“%hd”)。

那为啥它用的也不多呢?

因为它太省内存了,你说它就 −215∼215−1-2 ^ {15} \sim 2^{15} - 1(−32768∼32767-32768 \sim 32767,绝对值不超过 44 万)的存储范围能存个啥?考虑到一般情况下卡时间的出题人比卡空间的多得多,而且一般卡空间也不是换个数据类型就能解决的,因此一般还是用 int。

与这两个对应的,浮点数除了 double 还有 float 和 long double,但如果 auto 一下就会发现其实默认用的也是 int(整数)、double(浮点)。存储范围太大了不好,太小了也不行,工程的本质就是寻找中间这么一个“刚刚好”,这就是所谓中庸之道。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
关于__int128和short,你需要知道的一切
https://www.leo2011.eu.org/posts/int128-short/
作者
Block_Fish
发布于
2023-11-25
许可协议
SATA

评论区

Profile Image of the Author
Block_Fish
大胆假设,小心求证。——胡适
公告
网站全面重构,有问题欢迎联系积木鱼!
分类
标签
最新动态
站点统计
文章
56
分类
7
标签
17
总字数
84,805
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Netlify CI
博客版本
Firefly v6.16.8
文章许可
SATA

当前页面没有目录

文章目录

当前页面没有目录