分裂很久很久

时间:2011-04-12 17:27:26

标签: c++

一个人如何“分裂”即长长型,因此它的第一部分是长型的var而第二部分也是长型的var。

long long long_type = 0xaaaabbbbccccdddd;

并且在第一个int中我想要long_type var的前半部分(从哪一侧无关紧要)和第二个var int的后半部分。

4 个答案:

答案 0 :(得分:6)

你的问题很模糊。这取决于你所说的“分裂”。您可以拆分原始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);

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

答案 1 :(得分:5)

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

然后使用位操作将其拆分为:

uint64_t long_type = smthng;
uint32_t high = (long_type & 0xFFFFFFFF00000000ULL) >> 32;
uint32_t low = long_type & 0xFFFFFFFF;

答案 2 :(得分:1)

long a = long_type;
long b = (static_cast<unsigned long long>(long_type) >> 32);

答案 3 :(得分:0)

以下是如果您想要移植性,的示例:

union MyUnion
{
    long long n64;
    struct
    {
        long lo32;
        long hi32;
    };
};

MyUnion u;
u.n64 = 0xaaaaaaaabbbbbbbb;
long lo = u.lo32; // 0xaaaaaaaa
long hi = u.hi32; // 0xbbbbbbbb

此联盟不适用于大端机器。但是太糟糕了;我更喜欢语法。