C++中有 128 位整数吗?
Is there a 128 bit integer in C++?
我需要在变量中存储一个 128 位长的 UUID。C++中有 128 位数据类型吗?我不需要算术运算,我只想非常快速地轻松存储和读取值。
C++11 的新功能也可以。
虽然GCC确实提供了__int128
,但它只支持具有足够宽的整数模式以容纳128位的目标(处理器(。在给定的系统上,sizeof(( intmax_t
和uintmax_t
确定编译器和平台支持的最大值。
GCC和Clang支持__int128
Checkout boost 的实现:
#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
int128_t v = 1;
这比字符串和数组更好,特别是如果你需要用它做算术运算。
你的问题分为两部分。
1. 128-bit
整数。正如@PatrikBeck boost::multiprecision
所建议的,对于非常大的整数来说是很好的方法。
2.用于存储UUID
/GUID
/CLSID
或任何您称之为它的变量。在这种情况下,boost::multiprecision
不是一个好主意。您需要为此目的而设计的 GUID 结构。添加跨平台标记后,您只需将该结构复制到代码中并使其如下所示:
struct GUID
{
uint32_t Data1;
uint16_t Data2;
uint16_t Data3;
uint8_t Data4[8];
};
由于一些内部原因,此格式由Microsoft定义,您甚至可以将其简化为:
struct GUID
{
uint8_t Data[16];
};
使用简单的结构而不是可以处理一堆不同东西的对象,您将获得更好的性能。无论如何,您不需要使用 GUIDS 进行数学运算,因此您不需要任何花哨的对象。
我建议使用std::bitset<128>
(你总是可以做一些类似using UUID = std::bitset<128>;
的事情(。它可能具有与其他答案中提出的自定义结构类似的内存布局,但您无需定义自己的比较运算符、哈希等。
Visual-C++ 中没有 128 位整数,因为 Microsoft 调用约定只允许在 RAX:EAX 对中返回 2 个 32 位值。这一直令人头疼,因为当您将两个整数相乘时,结果是一个两个单词的整数。大多数加载和存储机器支持使用两个 CPU 字大小的整数,但使用 4 需要软件破解,因此 32 位 CPU 无法处理 128 位整数,8 位和 16 位 CPU 无法在没有相当昂贵的软件黑客的情况下处理 64 位整数。64 位 CPU 可以并且经常使用 128 位,因为如果将两个 64 位整数相乘,则会得到一个 128 位整数,因此 GCC 版本 4.6 确实支持 128 位整数。这在编写可移植代码时带来了问题,因为您必须做一个丑陋的黑客,在返回寄存器中返回一个 64 位字,并使用引用传递另一个字。例如,为了使用 Grisu 快速打印浮点数,我们使用 128 位无符号乘法,如下所示:
#include <cstdint>
#if defined(_MSC_VER) && defined(_M_AMD64)
#define USING_VISUAL_CPP_X64 1
#include <intrin.h>
#include <intrin0.h>
#pragma intrinsic(_umul128)
#elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
#define USING_GCC 1
#if defined(__x86_64__)
#define COMPILER_SUPPORTS_128_BIT_INTEGERS 1
#endif
#endif
#if USING_VISUAL_CPP_X64
UI8 h;
UI8 l = _umul128(f, rhs_f, &h);
if (l & (UI8(1) << 63)) // rounding
h++;
return TBinary(h, e + rhs_e + 64);
#elif USING_GCC
UIH p = static_cast<UIH>(f) * static_cast<UIH>(rhs_f);
UI8 h = p >> 64;
UI8 l = static_cast<UI8>(p);
if (l & (UI8(1) << 63)) // rounding
h++;
return TBinary(h, e + rhs_e + 64);
#else
const UI8 M32 = 0xFFFFFFFF;
const UI8 a = f >> 32;
const UI8 b = f & M32;
const UI8 c = rhs_f >> 32;
const UI8 d = rhs_f & M32;
const UI8 ac = a * c;
const UI8 bc = b * c;
const UI8 ad = a * d;
const UI8 bd = b * d;
UI8 tmp = (bd >> 32) + (ad & M32) + (bc & M32);
tmp += 1U << 31; /// mult_round
return TBinary(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32), e + rhs_e + 64);
#endif
}
使用TBigInteger
模板并在模板数组中设置任何位范围,如下所示TBigInt<128,true>
设置为有符号 128 位整数,TBigInt<128,false>
设置为无符号 128 位整数。
希望这有助于延迟回复,其他人已经找到了这种方法。
TBigInt是由虚幻引擎定义的结构。它提供多位整数覆盖。
基本用法(据我所知(:
#include <Math/BigInt.h>
void foo() {
TBigInt<128, true> signed128bInt = 0;
TBigInt<128, false> unsigned128bInt = 0;
}
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 0-1背包代码中的错误.我的代码中有什么错误
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 如何检查一个c++字符串中有多少相同的字符/数字
- std中有类似find_last_of的函数,而string中没有
- 如何知道整数中的位数
- C++模板函数,用于比较任何无符号整数和有符号整数
- C++编译器中有哪些非确定性的例子?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- Eclipse CDT:单个项目中有多个C++文件
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 从没有强制转换的整数中获取指针。知道什么,但不知道如何
- 如何将 32 位有符号整数放入更高的 32 位 64 位无符号整数中
- 使用 Python 编程的 32 位整数中有多少个'1'
- C++中有 128 位整数吗?
- 对多个整数中的位进行计数..有更快的方法吗
- C++:有符号64位整数中两个无符号64位的整数之差
- 在c++中有没有更快的方法来检验一个数是否是2的整数次幂?
- 有可能知道整数类型中有多少位吗
- C/C++中有符号整数表达式的代数约简