C++中将uint16_t拆分为2个uint8_t变量后cout输出异常问题咨询
问题成因
你的16位变量拆分逻辑本身完全正确,问题出在std::cout的输出规则上:
- 绝大多数C++标准库实现中,
uint8_t是unsigned char的别名 std::cout处理char/unsigned char/signed char类型时,默认会将其作为ASCII字符输出,而非整数值。你代码里拆分得到的high = 0x12是不可见控制字符,low = 0x34对应ASCII字符4,所以输出看起来是错误的,实际变量存储的值是完全正确的,你可以通过调试器查看变量内存值确认这一点- 当你把变量改为
uint16_t类型时,std::cout会识别为整数类型,按你指定的hex格式输出数值,所以结果符合预期
正确实现方案
拆分逻辑不需要修改,只需要在输出时将uint8_t类型强制转换为整数类型即可,变量依然可以用uint8_t存储,注意要引入cstdint头文件才能标准使用定长整数类型:
#include <iostream> #include <cstdint> using namespace std; int main() { uint16_t value = 0x1234; uint8_t high = static_cast<uint8_t>((value & 0xFF00) >> 8); uint8_t low = static_cast<uint8_t>(value & 0x00FF); // 输出时强制转换为unsigned int即可输出十六进制数值 cout << "higher is " << hex << static_cast<unsigned int>(high) << endl; cout << "lower is " << hex << static_cast<unsigned int>(low) << endl; return 0; }
如果需要固定输出两位十六进制、不足位补前导零,可以引入iomanip头文件添加格式控制:
#include <iomanip> // 输出部分修改为 cout << "higher is " << hex << setw(2) << setfill('0') << static_cast<unsigned int>(high) << endl; cout << "lower is " << hex << setw(2) << setfill('0') << static_cast<unsigned int>(low) << endl;
内容的提问来源于stack exchange,提问作者binary_demon_01
相关产品推荐
相关产品推荐

