我在arduino.h库中找到了那些,并对低字节宏
感到困惑#define lowByte(w) ((uint8_t) ((w) & 0xff))
#define highByte(w) ((uint8_t) ((w) >> 8))
at lowByte:从WORD到uint8_t的转换是不是只取低字节?我知道他们w& 0x00ff得到低字节,但不会转换只取低字节?
在低/高:为什么他们不会使用小端,并读取大小/偏移
即。如果w为0x12345678,高电平为0x1234,低电平为0x5678,则将其写入存储器为78 56 34 12,如偏移量x
答案 0 :(得分:3)
at lowByte:从WORD到uint8_t的转换是不是只取低字节?我知道他们w& 0x00ff得到低字节,但不会转换为低字节?
是。有些人喜欢在他们的代码中更加明确,但你是对的。
在低/高:为什么他们不会使用小端,并读取大小/偏移
我不知道这意味着什么,"使用小尾巴"。
但是简单地将WORD
别名为uint8_t
并使用指针算法来"移动"原始对象通常具有未定义的行为。你不能像这样对象。我知道你的老师可能说你可以,因为它只是记忆中的一点点,但你的老师错了; C和C ++是计算机代码的抽象,并且有自己的规则。
比特移位是实现这一目标的传统方式。
答案 1 :(得分:0)
如果是lowByte
,则uint8_t
的投射等同于(w) & 0xff)
。
关于“使用小端”,您不希望访问该值的单个字节,因为您不一定知道您的系统是使用大端还是小端。
例如:
uint16_t n = 0x1234;
char *p = (char *)&n;
printf("0x%02x 0x%02x", p[0], p[1]);
如果您在一个小端机器上运行此代码,它将输出:
0x34 0x12
但如果你在一台大型机器上运行它,你会得到:
0x12 0x34
通过使用shift和按位运算符,您可以使用值,必须在所有实现上都相同,而不是表示值可能会有所不同。
因此,除非您有非常具体的理由,否则不要对单个字节进行操作。