一个人如何“分裂”即长长型,因此它的第一部分是长型的var而第二部分也是长型的var。
long long long_type = 0xaaaabbbbccccdddd;
并且在第一个int中我想要long_type var的前半部分(从哪一侧无关紧要)和第二个var int的后半部分。
答案 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
此联盟不适用于大端机器。但是太糟糕了;我更喜欢语法。