【问题标题】:How to create a 128-bit integer literal?如何创建 128 位整数文字?
【发布时间】:2018-07-26 12:17:51
【问题描述】:

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

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

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

【问题讨论】:

  • 整数字面量必须可以用一些内置的整数类型(通常最多 64 位)来表示,您稍后将它分配给可以保存数字的类型并不重要。
  • 您是否尝试过将 Ls 添加到文字中?否则,您可能必须声明一个自定义文字并自己构造 uint128_t。
  • @GoswinvonBrederlow 添加 Ls 无济于事。
  • 是否正在为此声明自定义文字可能的解决方案?

标签: c++ literals int128


【解决方案1】:

您可以为 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

【讨论】:

    【解决方案2】:

    标准不强制要求 128 位整数文字,因此是否允许它们取决于实现。大多数都没有,因此您需要将其分解为两个 64 位组件并使用按位运算符将它们组合起来:

    __uint128_t num = ((__uint128_t)0x75f17d6b3588f843 << 64) | 0xb13dea7c9c324e51;
    

    一个好的编译器应该在编译时执行这些操作。

    【讨论】:

    • 嗨,这看起来很酷,但结果和原来的不一样,它得到 0x514e329c7cea3db143f888356b7df175
    • @Bida 你到底是怎么得到这个值的?如果您在 x86/x64 这样的小端机器上运行,则整数类型的字节以最低有效字节在前存储。如果您按顺序打印字节,您会在输出中看到这一点。
    • 标准没有针对 128 位整数文字的规则。就标准而言,实现甚至可以给它们类型int。但是,标准规定的最小值仅为 64 位,这适用于 long long
    • @dbush 是 eos 的小端序,抱歉你是对的
    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2015-02-19
    • 2011-09-03
    • 1970-01-01
    • 2013-07-20
    • 2013-08-28
    相关资源
    最近更新 更多