【发布时间】:2019-07-19 07:04:45
【问题描述】:
我试图将一个 2 字节的数字分成两个 1 字节的数字。但我得到错误的结果。假设号码为:0x1234H
uint8_t high = 0;
uint8_t low = 0;
high = static_cast<uint8_t >(val & 0xFF);
low = static_cast<uint8_t >(val >> 8);
cout << std::bitset<8>(high) << endl;
cout << std::bitset<8>(low) << endl;
cout << "high byte: " << static_cast<int >(high) << endl;
cout << "low byte: " << static_cast<int >(low) << endl;
当我运行代码时,我希望得到以下输出:
0x1234
00001100
00010010
high byte: 12
low byte: 34
然而我得到了,
0x1234
00110100
00010010
high byte: 34
low byte: 12
为什么我的尝试失败了?
【问题讨论】:
-
val & 0xFF给你的是低字节,而不是高字节 -
val >> 8为您提供高字节(iffval是一个 16 位整数,否则您可能需要屏蔽更多高位)。 -
在英语中,当一个数字被 cout'd(显示或打印)给用户时,最低有效字节总是在 text-representing-the-number 的右端(无论主机字节序)。因此,0x1234 是数字的文本,34 是最低有效 8 位。
-
请展示一个完整的例子,混淆十六进制/十进制文字和输出是相当普遍的,所以即使你做对了,添加缺失的部分会使问题更清楚
-
...例如,打印
0x34不会在您的屏幕上显示34(除非您使用正确的io-manipulator)
标签: c++ binary bit-manipulation bit-shift