那些按位操作如何工作以及为什么它不会使用小/小端

时间:2017-05-03 18:15:12

标签: arduino bit-manipulation bitwise-operators endianness

我在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

  • 读取w,您读取位置x
  • 的单词大小
  • 读取高位,读取位置x
  • 处的byte / uint8_t
  • 读取低电平,在x + 2位置读取字节/ uint8_t

2 个答案:

答案 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和按位运算符,您可以使用必须在所有实现上都相同,而不是表示值可能会有所不同。

因此,除非您有非常具体的理由,否则不要对单个字节进行操作。