Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cout的行为<&书信电报;带uint8和uint16的十六进制_C++_Hex_Stdout - Fatal编程技术网

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表示形式,这在技术上可能因您的操作系统而异,因

我注意到
cout
uint8\u t
无符号字符的别名。实际上,您正在打印一个值为
0xab
的字符,根据您的编码,该字符可能是无效字符


这可以通过将其强制转换为另一个整数类型、提前将其值转换为字符串或编写某种包装类来解决,该包装类实现了
std::ostream&operator
std::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;