Arduino 这些位操作是如何工作的,为什么不';它不使用小/小的尾数吗

Arduino 这些位操作是如何工作的,为什么不';它不使用小/小的尾数吗,arduino,bit-manipulation,bitwise-operators,endianness,Arduino,Bit Manipulation,Bitwise Operators,Endianness,我在arduino.h库中找到了这些,对低字节宏感到困惑 #define lowByte(w) ((uint8_t) ((w) & 0xff)) #define highByte(w) ((uint8_t) ((w) >> 8)) 在低字节:从WORD到uint8的转换不会只占用低字节吗?我知道他们用w&0x00ff来获得低字节,但演员阵容不就是要获得低字节吗 在低/高两个位置:为什么他们不使用小尾端,并使用大小/偏移量读取 i、 e.如果w为0x12345678,高电平为

我在arduino.h库中找到了这些,对低字节宏感到困惑

#define lowByte(w) ((uint8_t) ((w) & 0xff))
#define highByte(w) ((uint8_t) ((w) >> 8))
在低字节:从WORD到uint8的转换不会只占用低字节吗?我知道他们用w&0x00ff来获得低字节,但演员阵容不就是要获得低字节吗

在低/高两个位置:为什么他们不使用小尾端,并使用大小/偏移量读取

i、 e.如果w为0x12345678,高电平为0x1234,低电平为0x5678,则它们会在偏移量x处以78 56 34 12的形式将其写入内存

  • 若要读取w,请读取位置x处单词的大小
  • 要读取高位,请读取位置x处的字节/uint8\t
  • 要读取低位,请读取位置x+2处的字节/uint8\t
在低字节:从WORD到uint8的转换不会只占用低字节吗?我知道他们用w&0x00ff来获得低字节,但演员阵容不就是要获得低字节吗

对。有些人喜欢在他们的代码中特别明确,但你是对的

在低/高两个位置:为什么他们不使用小尾端,并使用大小/偏移量读取

我不知道这是什么意思,“使用小Endian”

但是,简单地将
单词
别名为
uint8\u t
并使用指针算法“移动”原始对象通常具有未定义的行为。不能像那样为对象设置别名。我知道你的老师可能说你可以,因为这只是记忆中的一点点,但你的老师错了;C和C++是计算机代码的抽象,并且有自己的规则。
位移位是实现这一点的常规方法。

低字节
的情况下,是的,转换到
uint8\u t
相当于
(w)&0xff)

关于“使用小尾端”,您不想访问单个字节的值,因为您不一定知道您的系统是使用大尾端还是小尾端

例如:

uint16_t n = 0x1234;
char *p = (char *)&n;
printf("0x%02x 0x%02x", p[0], p[1]);
如果在小型endian机器上运行此代码,它将输出:

0x34 0x12
但如果你在big endian机器上运行它,你会得到:

0x12 0x34
通过使用移位和按位运算符,可以对所有实现中必须相同的值进行操作,而不是对可能不同的值表示进行操作


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

如果你的问题中的endian部分意味着,要获得高字节,你应该颠倒字节顺序,然后访问低字节:这会起作用,但对于CPU来说,这比简单的移位(至少是不优化的移位)要大得多。在宏中编写并不是那么容易。这就是使用移位的充分理由。许多编译器可以查看这样的构造,并将它们完全重新排列为最佳指令。最简单的代码对编译器来说是最容易优化的。关键是,无论处理器的端号是多少,所显示的代码都可以工作,它们是用逻辑术语表示的,而不是内存布局terms@pm100非常感谢。终于有人理解了我的Endian问题:这些宏与Endian无关。除非你做了一些“肮脏”的事情与指针铸造,你不会受到endianess的影响。如果是,请提供一个。请注意,ARDUNO不是C,也不是C++。对于宏。不要在(n内联)函数也可以的地方使用宏!考虑到它是arduino库,您可能确实知道您运行的是哪种系统以及它的持久性是什么。