这些宏有什么作用?

时间:2014-08-26 11:14:23

标签: c pic

我继承了一些严重混淆且写得不好的PIC代码进行修改。这里有两个宏:

#define TopByteInt(v) (*(((unsigned char *)(&v)+1)))
#define BottomByteInt(v) (*((unsigned char *)(&v)))

有人能够解释他们到底做了什么以及这意味着什么?

谢谢:)

3 个答案:

答案 0 :(得分:5)

它们一次访问一个16位整数变量,允许访问最重要和最不重要的字节。假设小端字节顺序。

用法如下:

uint16_t v = 0xcafe;
const uint8_t v_high = TopByteInt(&v);
const uint8_t v_low  = BottomByteInt(&v);

上述情况会导致v_high 0xcav_low成为0xfe

这是一个相当可怕的代码,以算术方式做到这一点会更清晰:

#define TopByteInt(v)    (((v) >> 8) & 0xff)
#define BottomByteInt(v) ((v) & 0xff)

答案 1 :(得分:1)

(*((unsigned char *)(&v)))

它将v(16位整数)转换为char(8位),这样做只得到底部字节。

(*(((unsigned char *)(&v)+1)))

这是相同的,但它得到v的地址和1个字节的总和,所以它只得到顶部的字节。

如果v是16位整数,它将仅按预期工作。

答案 2 :(得分:1)

UGG。

假设您使用的是小端平台,看起来它可能会被有意义地记录为

#define TopByteInt(v) (((v) >> 8) & 0xff)
#define BottomByteInt(v) ((v) & 0xff)

它基本上取变量v,并从中提取最低有效字节(BottomByteInt)和下一个更重要的字节(TopByteInt)。如果v不是16位值,'TopByte'有点用词不当。