为什么以十六进制读取uint8_t无法正常工作?

juz*_*lin 7 c++ iostream

考虑如下代码:

#include <iostream>
#include <sstream>

int main()
{
    std::stringstream ss;
    ss << "a0 b1";

    uint8_t byte;
    ss >> std::hex >> byte;    

    std::cout << std::hex << byte << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么这个输出a,而不是a0即使a0装配在uint8_t十六进制?

Lig*_*ica 12

因为uint8_t也是(可能)unsigned char,所以当您从C ++流执行格式化提取时,存在特殊规则

不幸的是,这只是一个别名,而不是唯一的类型

基本上,它跳过了“词法转换为数字”步骤,因为它认为您想提取一个字符。人物'a'

我认为,unsigned int如果需要,您将需要阅读然后缩小的文档。

如果确实减小到a uint8_t,那么出于同样的原因,还必须将其提升回更大的int(lol),以触发序列化。

现场演示

老实说,在处理流时,我只会避免使用较小的固定宽度类型(除非您使用read()和进行无格式的处理write())。忘记这个问题太容易了。

  • @Brandon一元加号运算符使uint8_t操作数提升为int,这成为表达式结果的类型。 (3认同)