使用uint16_t和按位操作时会发生什么数字

What number to expect when playing with uint16_t and bitwise ops

本文关键字:什么 数字 位操作 uint16 使用      更新时间:2023-10-16

我有这个简单的代码:

#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: %un", i);
    return 0;
}

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

Y被移动到左边的8位,h被添加到最后。i的最终内容应该是89 104的,对吧?

如果我然后打印i,我应该期望出来什么数字?我目前正在22888,我不确定为什么,也不确定这是否是我应该得到的。

89 现在处于较高的 8 位,因此它是 89*28+104 = 22888。

在十六进制中,它更明显:你拿了0x59,把它向左移动了 8 位,给你0x5900,然后加上0x68。 0x5968 = 22888。

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

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

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

在此之后,一个简单的按位 OR 运算符带有 h -> HEX: 0x68 DEC: 104

所以:

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