正如另一个问题中所写,无符号包装数学可以这样完成:
int tmp = (a - b) & 0xFFF; /* 12 bit mask. */
Writing到(12 位)位域将完全执行此操作,无论有符号还是无符号。唯一的区别是您可能会从编译器收到警告消息。
For reading不过,你需要做一些不同的事情。
对于无符号数学,这样做就足够了:
int result = tmp; /* whatever bit count, we know tmp contains nothing else. */
or
int result = tmp & 0xFFF; /* 12bit, again, if we have other junk in tmp. */
对于有符号数学,额外的魔力是符号扩展:
int result = (tmp << (32-12)) >> (32-12); /* asssuming 32bit int, and 12bit value. */
所做的只是在更宽的 int 上复制位域的最高位(位 11)。
这正是编译器对位域所做的事情。无论您是手动编码还是将其编码为位字段都取决于您,但请确保您获得了正确的幻数。
(我还没有阅读标准,但我怀疑依靠位域在溢出时做正确的事情可能不安全?)