使用 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 位,最后添加 h
。
i
最后的内容应该是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
我有这个简单的代码:
#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 位,最后添加 h
。
i
最后的内容应该是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