c++ - 如何创建 128 位整数文字?

标签 c++ literals int128

我有一个整数文字,格式为 0x75f17d6b3588f843b13dea7c9c324e51。有没有办法避免编译器语法错误“整数文字太大,无法用任何整数类型表示”?

因为我知道我可以使用这些类型(我正在使用 EOS 库中的 uint128_t,如果我手动插入它,它就可以工作)。

有没有办法在运行时以某种方式将这个字符串直接解析为完全相同的整数?

最佳答案

您可以为 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] != '\0'; ++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;
}

http://coliru.stacked-crooked.com/a/fec4fc0fd4ff1418

关于c++ - 如何创建 128 位整数文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51538694/

相关文章:

Python C-API int128 支持

c++ - 在 C++ 中将 .docx 转换为 .txt

c++ - 多态值类型和接口(interface)

c++ - 我应该始终为数字类型使用适当的文字吗?

javascript - 什么是 javascript 中的数组字面量表示法,什么时候应该使用它?

c++ - 使用正确的重载集调用多个函数的对象

c++ - 如何衡量一段代码执行的时间?

dart - 如何在Dart 2.2之后设置文字

c++ - 在 C++ 中进行基本 128 位整数计算的有效方法?