劈长劈长

splitting long long

本文关键字:      更新时间:2023-10-16

如何"拆分",即long long类型,使其第一部分在var类型的long中,第二部分也在var类型的long中。

long long long_type = 0xaaaabbbbccccdddd;

和在第一个int中,我希望有long_type var的前一半(不管从哪一边),在第二个var int中有后一半。

你的问题模棱两可。这取决于你对"分裂"的定义。您可以拆分原始long long值表示,也可以拆分long long对象表示

如果你想拆分值表示,那么你的问题甚至更加模糊,因为你的原始值是带符号的。您打算如何分割带符号的值?你期望什么样的结果?签署了吗?无符号?高阶部分有符号,低阶部分无符号?还是别的什么?

对于无符号值,它看起来如下(假设收件人类型long具有适合您的目的的大小)

unsigned long long long_type = ...;
unsigned long hi = long_type / ULONG_MAX;
unsigned long lo = long_type;

如果要拆分对象表示,正确的方法是使用memcpy(在这种情况下,原始值的签名不重要)

long long long_type = ...;
unsigned long hi, lo;
memcpy(&lo, &long_type, sizeof lo);
memcpy(&hi, (char *) &long_type + sizeof lo, sizeof hi);

当然,在这种情况下,哪一部分实际上是低阶的,哪一部分是高阶的将取决于平台。

我建议使用uint32_t和uint64_t或其他固定宽度类型。

然后使用位操作分割它,像

uint64_t long_type = smthng;
uint32_t high = (long_type & 0xFFFFFFFF00000000ULL) >> 32;
uint32_t low = long_type & 0xFFFFFFFF;
long a = long_type;
long b = (static_cast<unsigned long long>(long_type) >> 32);
相关文章:
  • 没有找到相关文章