我需要在变量中存储一个 128 位长的 UUID 。 C++ 中有 128 位数据类型吗?我不需要算术运算,我只想快速轻松地存储和读取值。
C++11 的一个新特性也可以。
原文由 danijar 发布,翻译遵循 CC BY-SA 4.0 许可协议
我需要在变量中存储一个 128 位长的 UUID 。 C++ 中有 128 位数据类型吗?我不需要算术运算,我只想快速轻松地存储和读取值。
C++11 的一个新特性也可以。
原文由 danijar 发布,翻译遵循 CC BY-SA 4.0 许可协议
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 位整数。这给编写可移植代码带来了问题,因为您必须做一个丑陋的 hack,在返回寄存器中返回一个 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
}
原文由 Cale McCollough 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
2 回答2k 阅读
GCC 和 Clang 支持
__int128