gcc本身具有__int128类型。然而,limits.h中没有定义它。我的意思是没有INT128_MAX或INT128_MIN这样的东西...gcc将常量解释为64位整数,这意味着如果我写#define INT128_MIN −170141183460469231731687303715884105728,它会抱怨类型告诉它截断了值。这对于在阵列上移动特别烦人。如何克服这个问题?
INT128_MAX
INT128_MIN
#define INT128_MIN −170141183460469231731687303715884105728
enxuqcxy1#
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;
xvw2m8pv2#
别傻了,用这个来求无符号最大值:
static const __uint128_t UINT128_MAX = ~__uint128_t{};
编辑:你可能想看看这些:
template <typename U> constexpr static auto bit_size_v(CHAR_BIT * sizeof(U)); template <typename U> constexpr static U min_v(std::is_signed_v<U> ? U(1) << (bit_size_v<U> - 1) : U{}); template <typename U> constexpr static U max_v(~min_v<U>);
u3r8eeie3#
既然你有标签[g++],我假设你对C++解决方案感兴趣:通常的std::numeric_limits<__int128>::max()只是工作…
std::numeric_limits<__int128>::max()
oipij1gg4#
由于目前gcc不支持定义int128整数,通常使用(high<<64)|low组合int128。然而,这个来源有一个完美的asnwer:
(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_MAX是2^127 - 1,即(1 << 127) - 1,然后可以计算其余常数。
2^127 - 1
(1 << 127) - 1
dgiusagp5#
在性能和内存使用方面并不理想,但这是我发现的唯一一件事。当然,在不允许非对齐内存访问的架构上,这根本不起作用。
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";
5条答案
按热度按时间enxuqcxy1#
xvw2m8pv2#
别傻了,用这个来求无符号最大值:
编辑:你可能想看看这些:
u3r8eeie3#
既然你有标签[g++],我假设你对C++解决方案感兴趣:通常的
std::numeric_limits<__int128>::max()
只是工作…oipij1gg4#
由于目前gcc不支持定义int128整数,通常使用
(high<<64)|low
组合int128。然而,这个来源有一个完美的asnwer:
INT128_MAX
是2^127 - 1
,即(1 << 127) - 1
,然后可以计算其余常数。dgiusagp5#
在性能和内存使用方面并不理想,但这是我发现的唯一一件事。当然,在不允许非对齐内存访问的架构上,这根本不起作用。