为什么我必须将一个字节强制转换为无符号两次才能看到十六进制输出
Why do I have to cast a byte as unsigned twice to see hex output?
我想将变量打印为十六进制:
#include <iostream>
#include <string>
#include <cstdint>
int main() {
auto c = 0xb7;
std::cout << std::hex << static_cast<unsigned char>(c) << std::endl;
std::cout << std::hex << static_cast<unsigned>(static_cast<unsigned char>(c)) << std::endl;
std::cout << std::hex << (uint8_t)(c) << std::endl;
std::cout << std::hex << (unsigned)(uint8_t)(c) << std::endl;
return 0;
}
输出似乎是:
ufffd (tries to print it as a char)
b7
ufffd (tries to print it as a char)
b7
我确实理解c有更高位集(10110111
),但我已经将其转换为uint8_t
和unsigned char
一次了。
为什么我必须再次将uint8_t
或unsigned char
转换为unsigned
才能获得预期的输出?
std::hex
通过调用str.setf(std::ios_base::hex, std::ios_base::basefield)
将流str的基字段设置为hex
。
当设置此基字段
hex
位时,iostream
s将十六进制基用于整数I/O。
代码
#include <iostream>
int main()
{
int i = 0xb7;
unsigned u = 0xb7;
char c = static_cast<char>(0xb7);
unsigned char b = 0xb7;
std::cout << std::hex << i << std::endl;
std::cout << std::hex << u << std::endl;
std::cout << std::hex << c << std::endl;
std::cout << std::hex << b << std::endl;
return 0;
}
输出
b7
b7
�
�
我怀疑这个输出在Windows(非UTF-8)系统上会有所不同。
相关文章:
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 是否可以在 c++ 中将两位数保存在无符号字符中
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 如何安全地比较两个无符号整数计数器?
- 获取两个无符号整数 C++ 乘积的高 32 位的有效方法
- 提升::精神 使用相同的符号两次
- SSE2 内部函数 - 找到两个无符号短向量的最大值
- 符号从 ifstream 读取两次
- 最快的函数将位置设置为一个无符号整数中两个位之间的位
- 将两个字符安全转换为无符号短字符
- C++模需要在两个*无*符号字节之间进行减法转换才能工作,为什么
- 有没有一种方法可以将无符号字符块移动到 STL 向量中,而不是一次移动 1 个无符号字符
- 为什么我必须将一个字节强制转换为无符号两次才能看到十六进制输出
- C++:有符号64位整数中两个无符号64位的整数之差
- 为什么我的无符号字节需要两倍大
- 使用std::copy将char数组中的两个字节复制到无符号short中
- 64位向量的点积速度比32位无符号整型向量快两倍
- 添加两个有符号或无符号整数
- 如何正确比较两个无符号字符?
- 在c++中是否正确地将两个无符号32位整数合并为一个无符号64位整数?