C++ cout的行为<&书信电报;带uint8和uint16的十六进制
我注意到C++ cout的行为<&书信电报;带uint8和uint16的十六进制,c++,hex,stdout,C++,Hex,Stdout,我注意到coutuint8\u t是无符号字符的别名。实际上,您正在打印一个值为0xab的字符,根据您的编码,该字符可能是无效字符 这可以通过将其强制转换为另一个整数类型、提前将其值转换为字符串或编写某种包装类来解决,该包装类实现了std::ostream&operatorstd::uint8\t是无符号字符的别名: typedef unsigned char uint8_t; 因此,将选择插入器的重载,该重载采用字符&,并写入0xab的ASCII表示形式,这在技术上可能因您的操作系统而异,因
coutuint8\u t
是无符号字符的别名。实际上,您正在打印一个值为0xab
的字符,根据您的编码,该字符可能是无效字符
这可以通过将其强制转换为另一个整数类型、提前将其值转换为字符串或编写某种包装类来解决,该包装类实现了std::ostream&operatorstd::uint8\t
是无符号字符的别名:
typedef unsigned char uint8_t;
因此,将选择插入器的重载,该重载采用字符&
,并写入0xab
的ASCII表示形式,这在技术上可能因您的操作系统而异,因为0xab
在扩展ASCII范围内
必须将其转换为整数:
std::cout << std::hex << static_cast<int>(a) << std::endl;
std::cout关于原因,其他答案都是正确的。最简单的修复方法是:
cout << hex << +a << endl;
当隐式转换足够时,不能尝试从不使用强制强制强制转换。@BenVoigt是在这个表达式中可以实现的隐式转换吗?@BenVoigt使用+
的技巧很好,但是在我看来,强制转换显示了更清晰的意图,并且对于那些看代码却不知道诀窍的人来说,它不会那么让人迷惑。@RetiredInja:那么请随意使用0u+a
,显然它必须产生至少与较大的操作数相同大小的结果(unsigned int
)。问题是,如果a
的类型发生变化,加法运算符不会突然开始做一些愚蠢的事情,比如强制转换。@kebs:假设您将变量更改为unsigned long long a=0x123456789abcdefULL代码>或双a=1.6代码>现在抛出的部分值,但无论是一元还是二进制<代码> +/> >将打印整个值。C++从不惊讶MeBTW <代码>十六进制<代码>是粘性的,一旦在第一行上执行,则它一直存在,直到您设置<代码> DEC < /代码>。
std::cout << std::hex << static_cast<int>(a) << std::endl;
cout << hex << +a << endl;