这些按位操作如何工作以及为什么不使用小端/小端序



我在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 上操作哪个必须在所有实现上都相同,而不是值的表示。可能有所不同。

因此,除非您有非常具体的原因。

最新更新