将有符号 32 位存储在无符号 64 位 int 中

Dr.*_*eon 0 c bit-manipulation int32

基本上,我想要的是在(最右边的 32 位)一个无符号的 64 位 int 中“存储”一个有符号的 32 位 int - 因为我想将最左边的 32 位用于其他目的。

我现在正在做的是一个简单的演员和面具:

#define packInt32(X) ((uint64_t)X | INT_MASK)
Run Code Online (Sandbox Code Playgroud)

但是这种方法有一个明显的问题:如果X是一个正整数(第一位没有设置),一切都会好起来的。如果它是负数,它就会变得一团糟。


问题是:

如何以最快和最有效的方式实现上述目标,同时支持负数?

Ger*_*rdh 9

你提到的“混乱”发生是因为你将一个小的有符号类型转换为一个大的无符号类型。在此转换期间,首先通过应用符号扩展来调整大小。这就是导致您遇到麻烦的原因。

您可以先将(有符号)整数简单地转换为相同大小的无符号类型。然后转换为 64 位不会触发符号扩展:

#define packInt32(X) ((uint64_t)(uint32_t)(X) | INT_MASK)
Run Code Online (Sandbox Code Playgroud)


dbu*_*ush 5

您需要屏蔽除低位 32 位之外的任何位。你可以用按位 AND 来做到这一点:

#define packInt32(X) (((uint64_t)(X) & 0xFFFFFFFF) | INT_MASK)
Run Code Online (Sandbox Code Playgroud)