我继承了一些经过严格混淆和写得不好的PIC代码来修改.这里有两个宏:
#define TopByteInt(v) (*(((unsigned char *)(&v)+1)))
#define BottomByteInt(v) (*((unsigned char *)(&v)))
Run Code Online (Sandbox Code Playgroud)
有人能够解释他们到底做了什么以及这意味着什么?
谢谢 :)
它们一次访问一个字节的16位整数变量,允许访问最重要和最不重要的字节半部.假设小端字节顺序.
用法如下:
uint16_t v = 0xcafe;
const uint8_t v_high = TopByteInt(&v);
const uint8_t v_low = BottomByteInt(&v);
Run Code Online (Sandbox Code Playgroud)
以上将导致v_high存在0xca和v_low存在0xfe.
这是相当可怕的代码,以算术方式执行此操作会更简洁:
#define TopByteInt(v) (((v) >> 8) & 0xff)
#define BottomByteInt(v) ((v) & 0xff)
Run Code Online (Sandbox Code Playgroud)
(*((unsigned char *)(&v)))
Run Code Online (Sandbox Code Playgroud)
它将 v (16 位整数)转换为 char (8 位),这样做你只得到底部字节。
(*(((unsigned char *)(&v)+1)))
Run Code Online (Sandbox Code Playgroud)
这是相同的,但它获取 v 的地址并加 1 个字节,因此它仅获取最高字节。
仅当 v 是 16 位整数时,它才会按预期工作。