c++ - 为什么 unsigned char 不能正确显示十六进制值

标签 c++ char hex

<分区>

我正在尝试创建一个 1 字节值的数组,使用无符号字符来保存值。

我的代码是这样的:

unsigned char state[4][4] = {   {0xd4, 0xe0, 0xb8, 0x1e},
                                {0xbf, 0xb4, 0x41, 0x27},
                                {0x5d, 0x52, 0x11, 0x98},
                                {0x30, 0xae, 0xf1, 0xe5}};

其中每个值都是 2 个十六进制数字,构成一个字节。但是,当我尝试使用

打印数组时
    cout << "\nInitial State \n------------------------------------------------------\n";
    for(int x = 0; x < 4; x++)
    {
        for(int y = 0; y < 4; y++)
            cout << hex << setw(2) << setfill('0') << state[x][y] << " ";
        cout << "\n";
    }

我没有得到十六进制值,而是得到了奇怪的符号

Initial State
---------------------
0Ô 0à 0¸ 0 
0¿ 0´ 0A 0' 
0] 0R 0 0˜ 
00 0® 0ñ 0å 

我知道 0 来自 set(w) 和 setfill('0') 但我不明白为什么它没有显示正确的值。但是,如果我将状态设置为无符号长整型,那么我将获得正确的值。

所以我很困惑。如果一个 char 恰好包含一个字节,为什么 char 不能将该字节显示为十六进制值?

最佳答案

cout 专门用于将 char 类型输出为字符,而不是数字。这也适用于无符号字符。您可以通过转换为 unsigned int 来绕过它。

cout << hex << setw(2) << setfill('0') << static_cast<unsigned int>(state[x][y]) << " ";

关于c++ - 为什么 unsigned char 不能正确显示十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33764309/

相关文章:

java - 按位运算 - 获取 ASCII 表中的下一个字符

c++ - 在构造函数中 ‘Player::Player()’ : error: invalid conversion from ‘const char*’ to ‘char’

C 提供带二进制位的 float 会产生错误的数字

c++ - 如何根据常量和返回类型调用重载函数?

c++ - 点运算符对效率的影响有多大?

c++ - 使用 CGAL 库构建 Visual C++ 应用程序

c++ - 如何解析一个c_str

string - 在 Arduino 上将 int 或 String 转换为 char 数组

c++ - 比较 8 位无符号整数与 HEX 失败

php - 从 PHP 写入十六进制到串口