如何创建128位整数文字

Bid*_*ida 11 c++ largenumber

我有一个格式的整数文字0x75f17d6b3588f843b13dea7c9c324e51.有没有办法避免编译器语法错误"整数文字太大而无法在任何整数类型中表示"?

因为我知道我可以使用这些类型(我正在使用uint128_tEOS库,如果我手动插入它,它可以工作).

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

小智 11

您可以为128位整数编写一个原始文字运算符(一种用户定义的文字,因为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;
}
Run Code Online (Sandbox Code Playgroud)

显然,这个实现是有问题的,因为我懒得开发一个完整的解决方案,它只支持十六进制,它不检查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;
}
Run Code Online (Sandbox Code Playgroud)

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


dbu*_*ush 8

标准不强制要求128位整数文字,因此如果要允许它们,则由实现决定.大多数都没有,因此您需要将其分解为两个64位组件并使用按位运算符组合它们:

__uint128_t num = ((__uint128_t)0x75f17d6b3588f843 << 64) | 0xb13dea7c9c324e51;
Run Code Online (Sandbox Code Playgroud)

一个好的编译器应该在编译时执行操作.

  • @Bida 你到底是如何得到这个值的?如果您在 x86/x64 等小端机器上运行,则整数类型中的字节首先存储最低有效字节。如果您按顺序打印字节,您将在输出中看到这一点。 (2认同)