【C代码】-对齐向上取整的宏

C代码 - 对齐向上取整的宏

概述

底层编程(尤其是 C/C++ 驱动开发、内存管理)中极其经典的对齐向上取整(Alignment Up)算法。

#define ALIGN_UP(s, a) (((s) + (a) - 1) & ~((a) - 1))
  • 注意: 这个宏生效的前提是 a 必须是 2 的幂。如果 a = 3 或 a = 10,这个位运算逻辑就会失效。

使用举例1 - 4字节对齐

#include <stdio.h>
#include <stdint.h>


/**
 * 底层编程(尤其是 C/C++ 驱动开发、内存管理)中极其经典的**对齐向上取整(Alignment Up)**算法
 * 功能是:如果输入的 s 不是 a 的整数倍,则将 s 增加到下一个最近的 a 的整数倍;如果已经是整数倍,则保持不变。
 * 注意: 这个宏生效的前提是 a 必须是 2 的幂。如果 a = 3 或 a = 10,这个位运算逻辑就会失效。
 */
#define ALIGN_UP(s, a) (((s) + (a) - 1) & ~((a) - 1))

#define DF_ALIGN_SIZE 4

int main(void) {
    printf("========== C Test! ========== \n\n");

    for(int i=0;i<34;i++)
    {
        uint32_t base_payload_off = ALIGN_UP(i, DF_ALIGN_SIZE);
        printf("%d base_payload_off = %d \n",i,base_payload_off);
    }

    return 0;
}

运行结果:

========== C Test! ==========

0 base_payload_off = 0
1 base_payload_off = 4
2 base_payload_off = 4
3 base_payload_off = 4
4 base_payload_off = 4
5 base_payload_off = 8
6 base_payload_off = 8
7 base_payload_off = 8
8 base_payload_off = 8
9 base_payload_off = 12
10 base_payload_off = 12
11 base_payload_off = 12
12 base_payload_off = 12
13 base_payload_off = 16
14 base_payload_off = 16
15 base_payload_off = 16
16 base_payload_off = 16
17 base_payload_off = 20
18 base_payload_off = 20
19 base_payload_off = 20
20 base_payload_off = 20
21 base_payload_off = 24
22 base_payload_off = 24
23 base_payload_off = 24
24 base_payload_off = 24
25 base_payload_off = 28
26 base_payload_off = 28
27 base_payload_off = 28
28 base_payload_off = 28
29 base_payload_off = 32
30 base_payload_off = 32
31 base_payload_off = 32
32 base_payload_off = 32
33 base_payload_off = 36

使用举例2 - 16字节对齐

#include <stdio.h>
#include <stdint.h>


/**
 * 底层编程(尤其是 C/C++ 驱动开发、内存管理)中极其经典的**对齐向上取整(Alignment Up)**算法
 * 功能是:如果输入的 s 不是 a 的整数倍,则将 s 增加到下一个最近的 a 的整数倍;如果已经是整数倍,则保持不变。
 * 注意: 这个宏生效的前提是 a 必须是 2 的幂。如果 a = 3 或 a = 10,这个位运算逻辑就会失效。
 */
#define ALIGN_UP(s, a) (((s) + (a) - 1) & ~((a) - 1))

#define DF_ALIGN_SIZE 16

int main(void) {
    printf("========== C Test! ========== \n\n");

    for(int i=0;i<34;i++)
    {
        uint32_t base_payload_off = ALIGN_UP(i, DF_ALIGN_SIZE);
        printf("%d base_payload_off = %d \n",i,base_payload_off);
    }

    return 0;
}

运行输出结果:

========== C Test! ==========

0 base_payload_off = 0
1 base_payload_off = 16
2 base_payload_off = 16
3 base_payload_off = 16
4 base_payload_off = 16
5 base_payload_off = 16
6 base_payload_off = 16
7 base_payload_off = 16
8 base_payload_off = 16
9 base_payload_off = 16
10 base_payload_off = 16
11 base_payload_off = 16
12 base_payload_off = 16
13 base_payload_off = 16
14 base_payload_off = 16
15 base_payload_off = 16
16 base_payload_off = 16
17 base_payload_off = 32
18 base_payload_off = 32
19 base_payload_off = 32
20 base_payload_off = 32
21 base_payload_off = 32
22 base_payload_off = 32
23 base_payload_off = 32
24 base_payload_off = 32
25 base_payload_off = 32
26 base_payload_off = 32
27 base_payload_off = 32
28 base_payload_off = 32
29 base_payload_off = 32
30 base_payload_off = 32
31 base_payload_off = 32
32 base_payload_off = 32
33 base_payload_off = 48
posted @ 2026-02-28 10:49  doitjust  阅读(13)  评论(0)    收藏  举报