我有一个0x75f17d6b3588f843b13dea7c9c324e51
格式的整数文字。有没有一种方法可以避免编译器语法错误“整数文字太大而无法用任何整数类型表示”?
因为我知道我可以使用这些类型的类型(我正在使用EOS库中的uint128_t
,如果我手动将其插入,则可以工作)。
是否可以通过某种方式在运行时将此字符串直接解析为完全相同的整数?
答案 0 :(得分:10)
您可以为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;
}
显然,此实现存在问题,因为我懒得开发一个完整的解决方案,它仅支持十六进制,不检查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;
}
答案 1 :(得分:8)
128位整数文字不受标准强制要求,因此要允许它们由实现决定。大多数情况不是这样,因此您需要将其分解为两个64位组件,并使用按位运算符将它们组合起来:
__uint128_t num = ((__uint128_t)0x75f17d6b3588f843 << 64) | 0xb13dea7c9c324e51;
好的编译器应该在编译时执行操作。