如何将uint16_t拆分为两个uint8_t?代码输出异常求助
问题出在输出格式,不是拆分逻辑!
兄弟,你的拆分代码完全没问题——partA确实是0x71,partB也确实是0x33。之所以输出成q和3,是因为绝大多数编译器里uint8_t就是unsigned char的别名,std::cout遇到unsigned char类型时,默认会输出它对应的ASCII字符:
0x71对应的ASCII就是小写字母q0x33对应的ASCII就是数字字符3
解决办法很简单,让cout把它当整数输出就行
这里有两种常用的方案:
方案1:输出前强制转成整数类型
把uint8_t转换成unsigned int(或者uint16_t)再输出,这样cout就会按照整数格式处理:
#include <iostream> #include <cstdint> int main() { uint16_t value = 0x7133; uint8_t partA = static_cast<uint8_t>((value & 0xFF00) >> 8); uint8_t partB = static_cast<uint8_t>(value & 0x00FF); // 强制转换为unsigned int后输出十六进制 std::cout << std::hex << static_cast<unsigned int>(partA) << '\n'; std::cout << std::hex << static_cast<unsigned int>(partB) << '\n'; return 0; }
方案2:格式化输出流,补全两位十六进制
如果想要输出固定两位的十六进制(比如05而不是5),可以配合iomanip里的工具:
#include <iostream> #include <cstdint> #include <iomanip> int main() { uint16_t value = 0x7133; uint8_t partA = static_cast<uint8_t>((value & 0xFF00) >> 8); uint8_t partB = static_cast<uint8_t>(value & 0x00FF); // 设置十六进制、宽度2、不足补0 std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(partA) << '\n'; std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(partB) << '\n'; return 0; }
额外提一句字节序
你当前的拆分逻辑是按大端字节序来的(高字节0x71存在partA,低字节0x33在partB)。如果你的场景需要适配小端平台,只需要交换两个变量的赋值逻辑,但从你的需求来看,当前的拆分是完全符合预期的。
内容的提问来源于stack exchange,提问作者Skanda
相关产品推荐
相关产品推荐

