如何创建 128 位整数文字?
How to create a 128-bit integer literal?
我有一个格式为 0x75f17d6b3588f843b13dea7c9c324e51
的整数文字。有没有办法避免编译器语法错误"integer literal is too large to be represented in any integer type"?
因为我知道我可以使用这些类型(我正在使用 EOS 库中的 uint128_t
,如果我手动插入它,它就可以工作)。
有没有办法在 运行 时以某种方式将此字符串直接解析为完全相同的整数?
128 位整型文字不是标准强制要求的,因此是否允许它们取决于实现。大多数不会,因此您需要将其分解为两个 64 位组件并使用按位运算符将它们组合起来:
__uint128_t num = ((__uint128_t)0x75f17d6b3588f843 << 64) | 0xb13dea7c9c324e51;
一个好的编译器应该在编译时执行这些操作。
您可以为 128 位整数编写 user defined literal (C++11 起)。
原始文字运算符采用单个 const char*
作为参数。你可以编写一个函数体来解析字符串。
例如:
// Use __uint128_t for demonstration.
constexpr __uint128_t operator""_uint128_t(const char* x)
{
__uint128_t y = 0;
for (int i = 2; x[i] != '[=10=]'; ++i)
{
y *= 16ull;
if ('0' <= x[i] && x[i] <= '9')
y += x[i] - '0';
else if ('A' <= x[i] && x[i] <= 'F')
y += x[i] - 'A' + 10;
else if ('a' <= x[i] && x[i] <= 'f')
y += x[i] - 'a' + 10;
}
return y;
}
显然,这个实现是有问题的,因为我懒得开发一个完整的解决方案,它只支持十六进制,它不检查0x
前缀,等等,它需要 C++14 宽松的 constexpr
函数。但它表明您实际上可以将此字符串直接解析为完全相同的整数。
我们来测试一下:
int main()
{
auto abc = 0x1234567890ABCDEFfedcba0987654321_uint128_t;
std::uint64_t higher = abc >> 64;
std::uint64_t lower = abc;
std::cout << std::hex << higher << ' ' << lower;
}
我有一个格式为 0x75f17d6b3588f843b13dea7c9c324e51
的整数文字。有没有办法避免编译器语法错误"integer literal is too large to be represented in any integer type"?
因为我知道我可以使用这些类型(我正在使用 EOS 库中的 uint128_t
,如果我手动插入它,它就可以工作)。
有没有办法在 运行 时以某种方式将此字符串直接解析为完全相同的整数?
128 位整型文字不是标准强制要求的,因此是否允许它们取决于实现。大多数不会,因此您需要将其分解为两个 64 位组件并使用按位运算符将它们组合起来:
__uint128_t num = ((__uint128_t)0x75f17d6b3588f843 << 64) | 0xb13dea7c9c324e51;
一个好的编译器应该在编译时执行这些操作。
您可以为 128 位整数编写 user defined literal (C++11 起)。
原始文字运算符采用单个 const char*
作为参数。你可以编写一个函数体来解析字符串。
例如:
// Use __uint128_t for demonstration.
constexpr __uint128_t operator""_uint128_t(const char* x)
{
__uint128_t y = 0;
for (int i = 2; x[i] != '[=10=]'; ++i)
{
y *= 16ull;
if ('0' <= x[i] && x[i] <= '9')
y += x[i] - '0';
else if ('A' <= x[i] && x[i] <= 'F')
y += x[i] - 'A' + 10;
else if ('a' <= x[i] && x[i] <= 'f')
y += x[i] - 'a' + 10;
}
return y;
}
显然,这个实现是有问题的,因为我懒得开发一个完整的解决方案,它只支持十六进制,它不检查0x
前缀,等等,它需要 C++14 宽松的 constexpr
函数。但它表明您实际上可以将此字符串直接解析为完全相同的整数。
我们来测试一下:
int main()
{
auto abc = 0x1234567890ABCDEFfedcba0987654321_uint128_t;
std::uint64_t higher = abc >> 64;
std::uint64_t lower = abc;
std::cout << std::hex << higher << ' ' << lower;
}