【发布时间】:2021-09-13 22:20:28
【问题描述】:
在查看各种 sdk 时,LOBYTE 和 HIBYTE 似乎很少一致,如下所示。
窗户
#define LOBYTE(w) ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define HIBYTE(w) ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff))
各种 Linux 头文件
#define HIBYTE(w) ((u8)(((u16)(w) >> 8) & 0xff))
#define LOBYTE(w) ((u8)(w))
如果转换为 u8,为什么需要 & 0xff?为什么以下方法不是要走的路? (假设定义了 uint8_t 和 uint16_t)
#define HIBYTE(w) ((uint8_t)(((uint16_t)(w) >> 8)))
#define LOBYTE(w) ((uint8_t)(w))
【问题讨论】:
-
添加了一些标签,因为如果这不是是为了避免任何偷偷摸摸的陷阱,那对于 Stack Overflow 来说太主观了。
-
注意
uint8_t、uint16_t等是可选的;实现甚至不需要具有这些特定宽度的整数类型。 (例如unsigned char不必是 8 位宽,并且存在 9 位或 32 位的系统。)因此它们不能用于真正的“跨平台”解决方案。 -
@NateEldredge 假设它们已定义。
-
"如果转换为 u8,为什么需要 & 0xff?" --> Belt and suspenders。单独使用
(uint8_t)更可取,因为它定义了类型。 -
进一步注意
u8和u16是可选的uint8_t和uint16_t的进一步可选类型定义。uint8_t和uint16_t更有可能通过stdint.h标头提供。鉴于您的所有三个示例,带有uint8_t和uint16_t的示例是最便携的。
标签: c language-lawyer platform-agnostic