【ARM 嵌入式 C 入门及渐进 1.2 -- 是否为 n 字节对齐】

请阅读【嵌入式开发学习必备专栏】


文章目录

    • [是否为 n 字节对齐](#是否为 n 字节对齐)

是否为 n 字节对齐

在C语言中,你可以定义一个宏来检查一个给定地址是否是n字节对齐的。这里的n应该是2的幂(例如,2、4、8、16等)。要做到这一点,可以利用位操作的特性。具体地,如果一个地址与n-1进行位与操作的结果为0,则该地址是n字节对齐的。

下面是如何实现这个宏的示例:

c 复制代码
#include <stdio.h>
#include <stdint.h>

// 定义一个宏,用于检查ptr是否为n字节对齐
// ptr为需要检查的地址,n为对齐的字节数,必须是2的幂
#define IS_ALIGNED(ptr, n) (!((uintptr_t)(ptr) & ((n) - 1)))

int main(void) 
{
    int x;
    double y;
    void *p1 = &x; // int类型的变量地址
    void *p2 = &y; // double类型的变量地址
    void *p3 = (void*)0x1005; // 假设的非对齐地址,仅作为示例
    
    // 检查是否为4字节对齐
    printf("p1 is %saligned to 4 bytes.\n", IS_ALIGNED(p1, 4) ? "" : "not ");
    
    // 检查是否为8字节对齐
    printf("p2 is %saligned to 8 bytes.\n", IS_ALIGNED(p2, 8) ? "" : "not ");
    
    // 检查0x1005地址是否为4字节对齐
    printf("p3 is %saligned to 4 bytes.\n", IS_ALIGNED(p3, 4) ? "" : "not ");
   
    return 0;
}

在这个示例中:

  • IS_ALIGNED宏接收两个参数:ptrnptr是需要检查对齐的指针,而n是对齐的字节大小,必须是2的幂。
  • 宏使用了uintptr_t类型来确保指针能够被安全地转换为整数,这样就可以进行位操作。uintptr_t定义在<stdint.h>头文件中。
  • 如果ptrn-1的位与结果为0,那么宏返回真(即,ptrn字节对齐的),否则返回假。

这个宏非常通用,可以用于检查任何地址是否为2的幂字节对齐。

相关推荐
xiancai_xianyu11 分钟前
想把数据模型一次建完美再上AI?会一直卡在建模里
开发语言·人工智能·php·数据模型·语义层·本体建模·企业知识网络
充电zcx11 分钟前
Linux:2:Linux下的基本指令
linux·运维·服务器
繁星蓝雨19 分钟前
C++设计原理———重载(extern “C“的由来、顺序依赖、语义依赖、overload、名称修饰符、对象操作、运算符重载、新增运算符、枚举和布尔类型)
c语言·c++·extern c·overload·重载·语义依赖·顺序依赖
handler0123 分钟前
【Linux】虚拟地址空间解析
linux·运维·c++·线程·进程·虚拟地址空间·虚拟地址
(Charon)26 分钟前
【C++】网络缓冲区设计(二):Ring Buffer环形缓冲区、head/tail与跨界读写
开发语言·c++
Java后端的Ai之路36 分钟前
LangChain Deep Agents 从入门到企业实战
开发语言·人工智能·python·langchain·deepagents
会飞的拖把40 分钟前
Python文件操作详解:从文件读写到os、shutil模块实战
开发语言·python
RS迷途小书童1 小时前
Python 解析大疆无人机 SRT 字幕日志
开发语言·python·无人机
SuperByteMaster1 小时前
编译器将unsigned short 整体提升int和unsigned short 在内存中的分配2byte的理解
c语言
点心的游戏开发世界1 小时前
GDScript 入门笔记(十六):文件读写与数据持久化
开发语言·笔记·游戏引擎·godot