在C+;中,这是否正确地将两个无符号32位整数合并为一个无符号64位整数+;? 这是否正确地将两个无符号的32位整数组合成C++中的一个无符号的64位整数? std::uint32_t a = ... std::uint32_t b = ... std::uint64_t result = ((std::uint64_t)a << 32) | (std::uint64_t)b) std::uint32\u t a=。。。 std::uint32\U t b=。。。 std::uint64_t result=((std::uint64_t)a

在C+;中,这是否正确地将两个无符号32位整数合并为一个无符号64位整数+;? 这是否正确地将两个无符号的32位整数组合成C++中的一个无符号的64位整数? std::uint32_t a = ... std::uint32_t b = ... std::uint64_t result = ((std::uint64_t)a << 32) | (std::uint64_t)b) std::uint32\u t a=。。。 std::uint32\U t b=。。。 std::uint64_t result=((std::uint64_t)a,c++,C++,是的,它按照您的预期工作(如果它们真的未签名)。是的,它按照您的预期工作(如果它们真的未签名)。另一种方法: uint32_t a = xxx; uint32_t b = xxx; uint64_t result; uint32_t * p = (uint32_t *)&result; p[0] = b; p[1] = a; 或者更好: union { uint32_t b; uint32_t a; uint64_t res; } u3264; u3264 u; u.a =

是的,它按照您的预期工作(如果它们真的未签名)。

是的,它按照您的预期工作(如果它们真的未签名)。

另一种方法:

uint32_t a = xxx;
uint32_t b = xxx;
uint64_t result;
uint32_t * p = (uint32_t *)&result;
p[0] = b;
p[1] = a;
或者更好:

union
{
  uint32_t b;
  uint32_t a;
  uint64_t res;
} u3264;
u3264 u;
u.a = xxx;
u.b = yyy;
// 64 bit result in u.res
另一种方法:

uint32_t a = xxx;
uint32_t b = xxx;
uint64_t result;
uint32_t * p = (uint32_t *)&result;
p[0] = b;
p[1] = a;
或者更好:

union
{
  uint32_t b;
  uint32_t a;
  uint64_t res;
} u3264;
u3264 u;
u.a = xxx;
u.b = yyy;
// 64 bit result in u.res



你的意思是
uint32\u t a
b
同样吗?@SouravGhosh如果他的意思是
uint32\u t
,那么我认为这行不通。所以他可能是故意选择了
uint64\u t
。a必须有64位用于
a@SouravGhosh,我更正了代码。以前,我只是从代码中复制。a到
uint64\u t
I的转换这是必要的;你不需要施放
b
,尽管它是无害的。你的意思是
uint32\u t a
b
同样吗?@SouravGhosh如果他的意思是
uint32\u t
,那么我认为这行不通。所以他可能是故意选择了
uint64\u t
a@SouravGhosh,我更正了代码显然,我只是复制了我的代码。将a转换成
uint64\u t
是必要的;你不需要转换
b
,尽管它是无害的。你的意思是
uint32\u t a
b
同样吗?@SouravGhosh如果他的意思是
uint32\u t
,那么我认为这行不通。所以他可能是故意选择
uint64\u t
。对于
a@SouravGhosh,我更正了代码。之前,我只是从我的代码中复制。将a转换为
uint64\u t
是必要的;您不需要转换
b
,尽管它是无害的。缺少其他信息,自然的解释是
uint32\u t
是来自
@chearsandhth.-Al的f同意。尽管如此,在使用位运算符时强调这一点很重要,因此我将其保留在我的答案中。由于缺乏其他信息,自然的解释是,
uint32\u t
是来自
@chearsandhth的。阿尔夫同意。尽管如此,在使用位运算符时强调这一点很重要,因此我将其保留在我的答案中。L确认其他信息,自然的解释是,
uint32\u t
是来自
@chearsandhth.-Alf同意。不过,在使用位运算符时强调这一点很重要,所以我在回答中保留了它。如果你想打破严格的别名规则,我没有否决,但请注意这会带来平台依赖性nt结果,由于endianness。相比之下,原始代码是可移植的。是的,它不是可移植的。但另一种方式是:)union示例没有中断别名,但仍然使代码endianness相关。顺便说一句,您需要
uint32\u t a[2]
。无论如何,为什么要想出比OP已经得到的更糟糕的替代方案呢?这没有帮助。@i486这只是猜测和预成熟优化。我非常怀疑指针算法在任何CPU上的性能都会超过位运算符。特别是因为现代编译器会将任一版本代码优化为最优。如果您想打破严格的别名规则,我没有否决,但请注意,由于endianness,这会给出一个与平台相关的结果。相反,原始代码是可移植的。是的,它是不可移植的。但另一种方法是:)union示例并没有打破别名,但仍然使代码的endianess依赖。顺便说一句,您需要
uint32\u t a[2]
。无论如何,为什么要想出比OP已经得到的更糟糕的替代方案呢?这没有帮助。@i486这只是猜测和预成熟优化。我非常怀疑指针算法在任何CPU上的性能都会超过位运算符。特别是因为现代编译器会将任一版本代码优化为最优。如果您想打破严格的别名规则,我没有否决,但请注意,由于endianness,这会给出一个与平台相关的结果。相反,原始代码是可移植的。是的,它是不可移植的。但另一种方法是:)union示例并没有打破别名,但仍然使代码的endianess依赖。顺便说一句,您需要
uint32\u t a[2]
。无论如何,为什么要想出比OP已经得到的更糟糕的替代方案呢?这没有帮助。@i486这只是猜测和预成熟优化。我非常怀疑指针算法在任何CPU上的性能都会超过位运算符。特别是因为现代编译器会将任何一个版本代码优化为最佳版本。