1

我想知道为什么以下宏适用于 C 中的数据对齐? #define CMIALIGN(x,n) (size_t)((~(n-1))&((x)+(n-1)))说如果 n 等于 7 为什么下面的宏应该起作用?#define ALIGN8(x) (size_t)((~7)&((x)+7). 你能用一些例子来展示它,并说明这个公式为什么有效吗?是否有任何其他有形的数据对齐公式?

4

1 回答 1

2

的目的~N(其中 N 比您寻求的对齐小一)是确保您的数字中已经存在的所有高位在对齐后保持点亮,包括通过添加操作推到那里的位。对齐的实际舍入是通过添加NThis 来~N完成的不需要。

想象一下:

   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 : 160

我应该注意到,除了调用方检查零返回值之外,这并没有提供真正的溢出保护,这显然不是您想要用作向上舍入对齐值的值。

  11111110 : 254
+ 00000111 :   7
  --------   ----
  00000101 :   5  (of)
& 11111000 :  ~7
  --------   ----
  00000000 :   0
于 2013-10-15T02:43:39.797 回答