intN_t, uintN_t
来看一下定长整数类型都叫什么名字吧。
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
using int128_t = __int128_t;
using uint128_t = __uint128_t;
#include <bits/stdc++.h> // cstdint
using namespace std;
int8_t i8 = 0;
int16_t i16 = 0;
int32_t i32 = 0;
int64_t i64 = 0;
uint8_t u8 = 0;
uint16_t u16 = 0;
uint32_t u32 = 0;
uint64_t u64 = 0;
using int128_t = __int128_t;
using uint128_t = __uint128_t;
int128_t i128 = 0;
uint128_t u128 = 0;
int main() {
cout << sizeof i8 << endl;
cout << sizeof i16 << endl;
cout << sizeof i32 << endl;
cout << sizeof i64 << endl;
cout << sizeof i128 << endl;
cout << sizeof u8 << endl;
cout << sizeof u16 << endl;
cout << sizeof u32 << endl;
cout << sizeof u64 << endl;
cout << sizeof u128 << endl;
cout << boolalpha;
cout << is_integral<int8_t>() << endl;
cout << is_integral<int16_t>() << endl;
cout << is_integral<int32_t>() << endl;
cout << is_integral<int64_t>() << endl;
cout << is_integral<int128_t>() << endl;
cout << is_integral<uint8_t>() << endl;
cout << is_integral<uint16_t>() << endl;
cout << is_integral<uint32_t>() << endl;
cout << is_integral<uint64_t>() << endl;
cout << is_integral<uint128_t>() << endl;
return 0;
}
输出
1
2
4
8
16
1
2
4
8
16
true
true
true
true
false
true
true
true
true
false
前 10 行符合预期,但是后 10 行 __int128 的两个类型无法识别(在开启 -std=c++14 时),使用时需要注意,必要时添加特化。
怎么添加特化呢?
template <> struct std::is_integral<int128_t> : true_type {};
template <> struct std::is_integral<uint128_t> : true_type {};
这个 std:: 必须添加,否则会获得编译错误。但是 std::true_type 的 std:: 又不一定要加。
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18629812
浙公网安备 33010602011771号