用指针代替移位运算来读取变量的某个字节

先看下面这段代码:

static u32 g_VSOnlineFlg = 0x01020304;
static u8 a[5] = {0};
static u8 b[5] = {0};

a[0] = (u8)((g_VSOnlineFlg&0xFF000000)>>24);
a[1] = (u8)((g_VSOnlineFlg&0xFF0000)>>16);
a[2] = (u8)((g_VSOnlineFlg&0xFF00)>>8);
a[3] = (u8)((g_VSOnlineFlg&0xFF));

上面代码通过移位操作将变量 g_VSOnlineFlg 的4个字节依次倒入数组a[],这种方法比较浪费资源。比较好的做法是使用指针,使用 u8*指针把 g_VSOnlineFlg 的4个字节依次读取到数组中。
但需要注意两个问题:一是内存的对齐问题,MSP430中变量的高字节是放在内存的高地址的,而作为变量名的指针是指向低地址的;二是指针的变换问题,正确的表达式是 *((u8 *)&g_VSOnlineFlg + 0)。
所以上面的表达式可以等价为:

b[0] = *((u8 *)&g_VSOnlineFlg + 3);
b[1] = *((u8 *)&g_VSOnlineFlg + 2);
b[2] = *((u8 *)&g_VSOnlineFlg + 1);
b[3] = *((u8 *)&g_VSOnlineFlg + 0);

分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/%e7%94%a8%e6%8c%87%e9%92%88%e4%bb%a3%e6%9b%bf%e7%a7%bb%e4%bd%8d%e8%bf%90%e7%ae%97%e6%9d%a5%e8%af%bb%e5%8f%96%e5%8f%98%e9%87%8f%e7%9a%84%e6%9f%90%e4%b8%aa%e5%ad%97%e8%8a%82/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名