C++ 如何创建128位整数文字

C++ 如何创建128位整数文字,c++,largenumber,C++,Largenumber,我有一个整数文本,格式为0x75f17d6b3588f843b13dea7c9c324e51。有没有办法避免编译器语法错误“整型文字太大,无法在任何整型中表示” 因为我知道我可以使用这些类型(我正在使用EOS库中的uint128\u t,如果我手动插入它,它就会工作) 有没有办法在运行时直接将该字符串解析为完全相同的整数?128位整数文本不是标准要求的,因此如果希望允许,则由实现决定。大多数情况下不会,因此您需要将其分解为两个64位组件,并使用位运算符将它们组合起来: __uint128_t n

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

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


有没有办法在运行时直接将该字符串解析为完全相同的整数?

128位整数文本不是标准要求的,因此如果希望允许,则由实现决定。大多数情况下不会,因此您需要将其分解为两个64位组件,并使用位运算符将它们组合起来:

__uint128_t num = ((__uint128_t)0x75f17d6b3588f843 << 64) | 0xb13dea7c9c324e51;
您可以为128位整数编写原始文字运算符(一种用户定义的文字,自C++11以来)

原始文本运算符将单个
常量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;
}

整数文本必须由某种内置整数类型(通常高达64位)表示,您后来将其分配给某个可以保存数字的类型这一事实并不重要。您是否尝试过将Ls添加到文本中?否则您可能必须声明一个自定义文本并自己构造uint128\t。@GoswinvonBrederlow添加Ls将不会有帮助。对于C,同样的问题:声明自定义文本是否可能解决此问题?您好,这看起来很酷,但结果和原来的不一样,它得到了0x514e329c7cea3db143f888356b7df175@Bida您是如何获得该值的?如果您在x86/x64这样的小型endian计算机上运行,整数类型中的字节首先以最低有效字节存储。如果您按顺序打印字节,您将在输出。该标准没有针对128位整数文本的规则。就标准而言,实现甚至可以为它们提供类型
int
。但是,标准规定的最小值只有64位,这是针对
long
。@dbush对于eos来说是一个小的endian,对不起,你是对的
int main()
{
    auto abc = 0x1234567890ABCDEFfedcba0987654321_uint128_t;
    std::uint64_t higher = abc >> 64;
    std::uint64_t lower = abc;
    std::cout << std::hex << higher << ' ' << lower;
}