我想知道为什么下面的宏适用于C中的数据对齐?
#define CMIALIGN(x,n) (size_t)((~(n-1))&((x)+(n-1)))
如果n等于7,为什么以下宏应该有效? #define ALIGN8(x) (size_t)((~7)&((x)+7)
。你能用一些例子来展示它并告诉为什么这个公式有效吗?有没有其他有形的数据对齐公式?
答案 0 :(得分:2)
~N
(其中N比您寻找的路线小一个)的目的是确保您的号码中已存在的所有高位都正确保持点亮在对齐之后,包括通过add操作推送的位。对齐的实际上舍入是通过添加N
来完成的。这确保了任何适当的进位被推入更高位的位置,然后保证与~N
的按位AND保持,同时确保底部位被扫除,因为它们不需要。
想象一下:
00100011 : 35
+ 00000111 : 7
-------- ----
00101010 : 42
& 11111000 : ~7
---------- ----
00101000 : 40
另一个例子:
11101111 : 239
+ 00000111 : 7
-------- ----
11110110 : 246
& 11111000 : ~7
-------- ----
11110000 : 240
最后,一个最终无所事事的例子,因为它已经对齐了:
10100000 : 160
+ 00000111 : 7
-------- ----
10100111 : 167
& 11111000 : ~7
-------- ----
10100000 : 240
我应该注意,除了调用方检查零返回值之外,这没有提供真正的溢出保护,这显然不是你想要用作舍入对齐值的。
11111110 : 254
+ 00000111 : 7
-------- ----
00000101 : 5 (of)
& 11111000 : ~7
-------- ----
00000000 : 0