使用 uint16_t 和按位运算时期望的数字是多少

What number to expect when playing with uint16_t and bitwise ops

我有这个简单的代码:

#include <stdio.h>
#include <stdint.h>

int main(void) {
    uint16_t i = 0;
    unsigned char *b = "Yh";
    i = b[1] | (b[0] << 8);
    printf("uint16_t: %u\n", i);
    return 0;
}

如您所见,我通过按位运算将 Y (HEX: 0x59, DEC: 89)h (HEX: 0x68, DEC: 104) 添加到 uint16_t

Y 向左移动 8 位,最后添加 hi最后的内容应该是89 104吧?

如果我然后打印 i,我应该得到什么数字? 我目前正在获得 22888,但我不确定为什么也不知道那是否是我应该获得的。

89现在在高8位,所以是89*28+104 = 22888.

在十六进制中,它更明显:您使用 0x59,将其左移 8 位得到 0x5900,然后添加 0x68。 0x5968 = 22888.

也许使用二进制更清楚发生了什么。

所以首先 Y -> HEX: 0x59 DEC: 89 向左移动 8 位:

0101 1001      = Y
0101 1001 << 8
--------------------
0101 1001 0000 0000 = (Y << 8)

之后是一个简单的按位或运算符 h -> HEX: 0x68 DEC: 104

所以:

0101 1001 0000 0000   = (Y << 8)
          0110 1000 | = h
---------------------
0101 1001 0110 1000 = 22888