我继承了一些严重混淆且写得不好的PIC代码进行修改。这里有两个宏:
#define TopByteInt(v) (*(((unsigned char *)(&v)+1)))
#define BottomByteInt(v) (*((unsigned char *)(&v)))
有人能够解释他们到底做了什么以及这意味着什么?
谢谢:)
答案 0 :(得分:5)
它们一次访问一个16位整数变量,允许访问最重要和最不重要的字节。假设小端字节顺序。
用法如下:
uint16_t v = 0xcafe;
const uint8_t v_high = TopByteInt(&v);
const uint8_t v_low = BottomByteInt(&v);
上述情况会导致v_high
0xca
和v_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'有点用词不当。