使用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: %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
相关文章:
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 有效创建数字签名的正确方法是什么?我可以使用DSA_sign_setup()吗?
- 有什么方法可以在 c++ 中组织"cycling"(循环)数字?
- 在Visual Studio中生成的匿名命名空间变量的损坏名称的数字部分是什么意思
- 获取数字最左边两个位的值的最便宜的方法是什么?
- 当我使用 += 将数字添加到数组中时,无论数字是什么,它总是以 0 结束
- 对这些 n^2 个数字进行排序的最快方法是什么
- 此代码中 * 1233 >> 12 计算十进制数字背后的数学原理是什么
- 从排序的数字数组中返回数字范围的最快方法是什么?
- 为什么我会遇到细分错误?将输出作为数字而不是字符串的原因是什么?
- 将字符*转换为数字的最快方法是什么
- 设计生成所有 n 位数字组合的递归函数的最佳方法是什么?
- 生成从 0 到 n-1 的数字的惯用方法是什么?
- 当我们将char强制转换为大于256的数字时会发生什么
- "first-chance exception..."消息中的十六进制数字是什么意思?
- gcc 预处理的表单哈希符号 + 数字"# 1"输出行是什么意思?
- 找到数字属于哪个部分的快速方法是什么(在 c++ 中使用向量)
- 使用uint16_t和按位操作时会发生什么数字
- 为小循环计数器选择什么数字类型