C 这些宏是做什么的?

C 这些宏是做什么的?,c,pic,C,Pic,我继承了一些非常模糊和写得很差的PIC代码来修改。这里有两个宏: #define TopByteInt(v) (*(((unsigned char *)(&v)+1))) #define BottomByteInt(v) (*((unsigned char *)(&v))) 有人能解释他们到底在做什么,这意味着什么吗 谢谢:)他们每次访问一个16位整数变量,允许访问最高有效和最低有效字节的一半。假定为小端字节顺序 用法如下: uint16_t v = 0xcafe; const

我继承了一些非常模糊和写得很差的PIC代码来修改。这里有两个宏:

#define TopByteInt(v) (*(((unsigned char *)(&v)+1)))
#define BottomByteInt(v) (*((unsigned char *)(&v)))
有人能解释他们到底在做什么,这意味着什么吗


谢谢:)

他们每次访问一个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)
它将v(一个16位整数)转换成一个字符(8位),这样做只会得到底部的字节

(*(((unsigned char *)(&v)+1)))
这是相同的,但它得到v的地址和1字节的和,所以它只得到顶部字节

只有当v是16位整数时,它才会按预期工作。

Ugg

假设您在一个小小的endian平台上,看起来它可能被记录为

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

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

它们是用于获取16位整数类型的上下半字节的宏。如果您无法解码这些简单表达式,那么您将在处理更复杂的代码时遇到麻烦。。。其中哪一点不清楚?写得很差的部分主要是无用的括号,而缺少一对必需的(对于某些参数)对:
#define TopByteInt(v)(*((unsigned char*)&(v)+1))
会更好…@MattMcNabb,我已经写了二十多年的嵌入式代码,在编写清晰易懂的代码方面没有任何困难,结构良好的代码。这不是。@malso,我不是说这些宏写得很糟糕,只是我不明白它们的意思。虽然,我已经向我解释过了,但我认为这是一种奇怪的写作方式。嗯?第一个宏显然也使用了
&v
,它不“强制转换整数”。是的,你说得对,它得到了存储在v地址中的前8位部分,这将更精确。我最喜欢这个解释,因为它指出“+1”正在访问下一个字节。这是我没有看到的一个突出点。谢谢。PIC是一个8位微控制器,可能是为了避免不必要的移位而写的。你的方式就是我写它的方式,只是我不使用bloomin宏@迪博斯科可能也不认识我,但有时候,靠近原始问题是很方便的。
#define TopByteInt(v) (((v) >> 8) & 0xff)
#define BottomByteInt(v) ((v) & 0xff)