2023-04-04 在C++中使用 int128 类型

在C++中使用 int128 类型

  • 前言
  • 一、int128 类型的简单使用
  • 总结


前言

看到一个题目: vector容器利用accumulate函数计算元素和, 连接地址: https://ask.csdn.net/questions/7916306/54147652

问题比较简单, 累计和超过了 int 类型的极限, 解决的方法是用 int64_t 来存储, 需要注意 accumulate 的第三个参数要给与合适的类型.

那么C++的内置数字的极限是什么, int128, 只不过此类型能进行计算, 却无法直接输出. 我们需要给它配个输出函数.


一、int128 类型的简单使用

对于绝大多数计算, int64_t 绰绰有余, 如果要把计算推到极限, 还可以使用 int128 类型, 当然更大的就要引入高精度库了.

我没有实现10进制的输出, 而是16进制的输出, 更贴近计算机的思维,但也不是纯计算机思维,否则输出二进制就好.

#include 
#include 

using int128_t = __int128;

void print_int128_t(const int128_t &num);

int main()
{
    int num = 0;
    std::cin >> num;
    
    std::vector<int128_t> iVec;
    iVec.reserve(num);
    
    for (int i = 0; i != num; ++i)
    {
        iVec.push_back(i);
    }
    
    int128_t sum = std::accumulate(iVec.begin(), iVec.end(), (int128_t)0); // 函数模板要靠第三个参数类型定返回类型
    
    print_int128_t(sum);
    
    return 0;
}

void print_int128_t(const int128_t &num)
{
    uint8_t arr[16];
    memcpy(arr, &num, 16);
    
    printf("0x");
    for (int i = 15; i != -1; --i)
    {
        printf("%02x", arr[i]);
    }
}

总结

大家可以尝试使用, 不过大多数时间是没有必要的, 且位长已经是64的二倍, 效率也不一定高.

你可能感兴趣的:(c++,开发语言)