我对以下代码的输出感到困惑:
uint8_t x = 0, y = 0x4a;
std::stringstream ss;
std::string a = "4a";
ss << std::hex << a;
ss >> x;
std::cout << (int)x << " "<< (int)y << std::endl;
std::cout << x << " "<< y <<std::endl;
std::cout << std::hex << (int)x << " " << (int)y << std::endl;
uint8_t z(x);
std::cout << z;
上面的输出是:
52 74 4 J34 44
,当我们改变时,用
替换第一行uint16_t x = 0, y = 0x4a;
输出变成:
74年74
74年74
4 4 J我想我明白发生了什么,但我不明白为什么会发生,或者我如何预防它/解决它。根据我的理解,std::hex
修饰符由于x
的类型而在某种程度上被破坏了,也许在技术层面上不完全正确,但它只是写了它读到的第一个字符。
背景:输入应该是一个十六进制数字字符串,每对代表一个字节(就像位图一样,只是在字符串中)。我希望能够读取每个字节并将其存储在uint8_t
中,所以当我遇到这个问题时,我正在进行实验。我仍然不能确定什么是最好的方法,所以如果你认为我所做的是低效或不必要的,我会很感激知道为什么。谢谢你的阅读,
ss >> x
将uint8_t x视为unsigned char。'4'的ascii值是(十进制)52。它将字符串"4a"的第一个字符读入x,就好像x是一个字符一样。当你切换到uint16_t时,它将其视为无符号短整数类型。