如何将uint16_t更改为两个uint8_t?

时间:2019-09-09 14:31:00

标签: c++ bit-shift masking

如何将一个uint16_t转换为两个部分?

uint16_t value = 0x7133;
uint8_t partA = (uint8_t)((value & 0xFF00) >> 8);
uint8_t partB = (uint8_t)(value & 0x00FF);
std::cout << std::hex << partA << std::endl; 
std::cout << std::hex << partB << std::endl;

对于上面的代码,我得到partAqpartB3,而不是0x710x33

2 个答案:

答案 0 :(得分:5)

uint8_t放入cout中将得到operator<<(const char&),该q会打印字母,而71和33恰好是3uint16_t value = 0x7133; uint8_t partA = static_cast<uint8_t>((value & 0xFF00) >> 8); uint8_t partB = static_cast<uint8_t>(value & 0x00FF); std::cout << std::hex << static_cast<int>(partA) << std::endl; std::cout << std::hex << static_cast<int>(partB) << std::endl; 的ASCII码。如果要查看数字,则必须使其选择不同的重载:

q
  

std :: hex没有任何作用

它确实有影响,但对字母没有影响。没有为static_cast应用十六进制格式。一旦选择了打印数字的重载,数字将被打印为十六进制。

PS:我将您的C风格演员表更改为InternetExplorerOptions capabilities = new InternetExplorerOptions(); capabilities.ignoreZoomSettings(); driver = new InternetExplorerDriver(capabilities); 。 C样式强制转换是一个危险信号,它们应该使您感到恐慌,因为大多数情况下它们只是隐藏一个错误。

答案 1 :(得分:1)

您正在以正确的方式进行转换。令人困惑的输出是uint8_t与平台上的char类型相同的结果。尝试将代码更改为

  std::cout << std::hex << (uint16_t)partA << std::endl; 
  std::cout << std::hex << (uint16_t)partB << std::endl;

然后您将看到

71
33