【问题标题】:How to change uint16_t to two uint8_t? [duplicate]如何将 uint16_t 更改为两个 uint8_t? [复制]
【发布时间】:2020-01-11 08:12:55
【问题描述】:

如何将一个 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;

对于上面的代码,我得到partA 作为qpartB 作为3 而不是0x710x33

【问题讨论】:

  • std::hex 没有任何作用?
  • 也很容易避免“警告:使用旧式强制转换... } [-Wold-style-cast]">(我相信我们都打开了这个警告! ) 我更喜欢用单行函数(包含强制转换)来转换,比如 "uint scu(uint b) { return static_cast(b); }" 使用 uint 支持自动提升...所以它只需要一些功能。
  • @2785528 uint scu(uint b) { return static_cast&lt;uint&gt;(b); } 完全没用。只需编写静态转换,而不是将它们隐藏在一些不起眼的(可能是错误的)函数后面。

标签: c++ bit-shift masking


【解决方案1】:

uint8_t 放入cout 会得到operator&lt;&lt;(const char&amp;),它会打印字母,而71 和33 恰好是q3 的ascii 代码。如果你想看到这个数字,你必须让它选择一个不同的重载:

uint16_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;

std::hex 没有任何作用

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

PS:我将您的 c 样式转换为 static_casts。 C 风格的转换是一个危险信号,它们应该让你感到恐慌,因为它们通常只是隐藏一个错误。

【讨论】:

  • ...有一个副本。我们不要在每次出现问题时都重复同样的答案。
  • @Max 如果你找到它我会很乐意删除它
【解决方案2】:

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

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

你会看到

71
33

【讨论】:

  • 这也可能导致 2x:警告:使用旧式强制转换为“uint16_t”{aka“short unsigned int”} [-Wold-style-cast]
猜你喜欢
  • 2019-09-18
  • 2014-07-23
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多