我正在尝试通过组合多个具有的无符号int值在C中创建32位地址。这些多个值很重要,需要全部存储到1个32位地址中。
例如:假设我有unsigned int outer = 25
,unsigned int inner = 984
,unsigned int offset = 3241
。外部int在32位地址中具有10个高位,内部int在32位地址中具有10个中位,而offset具有其余12位以存储其编号。
它看起来像:
OUTER | INNER | OFFSET
10 10 12 = 32 bit address
我知道,在此示例中,外部和内部整数可以存储0-2 ^ 10-1的值,而偏移量可以存储0-2 ^ 12-1的值,但是对于这些值,我不确定如何根据它们在32位地址中可以拥有的位数拆分它们,然后将所有内容伪造/合并到整个地址中。
不确定这是否符合您的目标,但是如果您允许,可以像这样进行设计
typedef struct {
union {
struct {
unsigned int offset : 12;
unsigned int outer : 10;
unsigned int inner : 10;
} bits;
unsigned int address;
}
} Address;
int main() {
Address a;
a.bits.offset = 3241;
a.bits.inner = 25;
a.bits.outer = 984;
printf("outer: %u\ninner: %u\noffset: %u\naddress: %08x", a.bits.outer,
a.bits.inner, a.bits.offset, a.address);
return 0;
}
输出
outer: 984
inner: 25
offset: 3241
address: 067d8ca9
尽管这取决于特定体系结构和编译器的字节序和位域的处理。
根据@ user3386109的答案:
address = (outer << 22) | (inner << 12) | offset;