0

gcc 本身具有 __int128 类型。

但是,它没有在 limits.h 中定义。我的意思是没有像INT128_MAX或这样的东西INT128_MIN……</p>

gcc 将文字常量解释为 64 位整数。这意味着如果我写#define INT128_MIN −170141183460469231731687303715884105728它会抱怨告诉它截断值的类型。

这对于在数组上移动尤其烦人。如何克服这一点?

4

5 回答 5

2
static const __uint128_t UINT128_MAX =__uint128_t(__int128_t(-1L));
static const __int128_t INT128_MAX = UINT128_MAX >> 1;
static const __int128_t INT128_MIN = -INT128_MAX - 1;
于 2021-04-13T12:51:19.633 回答
1

只是不要荒谬,并将其用于无符号最大值:

static const __uint128_t UINT128_MAX = ~__uint128_t{};
于 2021-07-03T07:36:30.247 回答
1

既然你有标签 [g++],我假设你对 C++ 解决方案感兴趣:通常的std::numeric_limits<__int128>::max()只是工作......

于 2021-04-14T13:06:10.960 回答
0

由于目前 gcc 不支持定义 int128 整数文字,通常使用(high<<64)|low.

然而,这个来源有一个完美的答案

#define INT128_MAX (__int128)(((unsigned __int128) 1 << ((sizeof(__int128) * __CHAR_BIT__) - 1)) - 1)
#define INT128_MIN (-INT128_MAX - 1)
#define UINT128_MAX ((2 * (unsigned __int128) INT128_MAX) + 1)

INT128_MAX2^127 - 1哪个是(1 << 127) - 1。然后可以计算其余的常数。

于 2020-06-11T14:30:37.517 回答
-2

在性能和内存使用方面并不理想,但这是我发现的唯一东西。当然,这在未授权未对齐内存访问的架构上根本不起作用。

const __int128 llong_min=*(__int128*)"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd";
const __int128 llong_max=*(__int128*)"\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
于 2020-06-11T14:19:24.697 回答