为什么我必须将一个字节强制转换为无符号两次才能看到十六进制输出

Why do I have to cast a byte as unsigned twice to see hex output?

本文关键字:两次 无符号 输出 十六进制 为什么 字节 一个 转换      更新时间:2023-10-16

我想将变量打印为十六进制:

#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_tunsigned char一次了。

为什么我必须再次将uint8_tunsigned 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)系统上会有所不同。