我在arduino.h库中找到了那些,并且对lowbyte宏观感到困惑
#define lowByte(w) ((uint8_t) ((w) & 0xff))
#define highByte(w) ((uint8_t) ((w) >> 8))
在lowbyte:从word到uint8_t的转换是否只是采用低字节?我知道他们是W&0x00ff获得低字节,但铸件不会拿到低字节吗?
在低/高:为什么他们不使用小恩迪安人,然后读取大小/偏移
即。如果w是0x12345678,高为0x1234,低为0x5678,则将其写入记忆为78 56 34 12在say Offset x offset x
- 要阅读W,您在位置读取单词大小x
- 要读高,您可以在位置读取字节/uint8_t x
- 要阅读低点,您可以在位置读取字节/uint8_t x 2
在lowbyte:从word到uint8_t的转换是否只是采用低字节?我知道他们是W&0x00ff获得低字节,但铸件不会拿到低字节吗?
是。有些人无论如何都喜欢在代码中额外明确,但是您是对的。
在低/高:为什么他们不使用小恩迪安人,然后读取大小/偏移
我不知道这是什么意思,"使用小恩德人"。
,但简单地将WORD
作为uint8_t
和使用指针算术来"移动"原始对象通常具有未定义的行为。您不能类似的对象。我知道您的老师可能会说您可以,因为这只是记忆中的所有东西,但是您的老师错了。C和C 是计算机代码上的抽象,并且具有自己的规则。
位转移是实现此目标的常规方法。
在lowByte
的情况下,是的, uint8_t
的铸件等于 (w) & 0xff)
。
关于"使用小恩迪安",您不想访问该值的个人字节,因为您不一定知道您的系统是在使用Big Endian还是Little Endian。
例如:
uint16_t n = 0x1234;
char *p = (char *)&n;
printf("0x%02x 0x%02x", p[0], p[1]);
如果您在一个小的endian机器上运行了此代码,它将输出:
0x34 0x12
但是,如果您在一台大型机器上运行它,则可以得到:
0x12 0x34
通过使用偏移和位运算符,您可以在 value 上操作哪个必须在所有实现上都相同,而不是值的表示。可能有所不同。
因此,除非您有非常具体的原因。