我正在尝试将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
为什么我的尝试失败了?
答案 0 :(得分:3)
那是因为您在这些行上给变量命名错误...
high = static_cast<uint8_t >(val & 0xFF);
low = static_cast<uint8_t >(val >> 8);
>>
运算符正在将位从高位位置向下移位到低位位置。如果您必须将这些位向下移以保留它们(在转换中),那是因为它们原来不是低位。所以...
low = static_cast<uint8_t >(val & 0xFF);
high = static_cast<uint8_t >(val >> 8);
BTW-无论如何,当转换为uint8_t时,按位和运算符是多余的-已经足以丢弃除低字节以外的所有字节。仍然正确,只是没有必要。