为什么无符号字符可以正确显示十六进制值

时间:2015-11-17 18:24:24

标签: 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(&#39; 0&#39;)但我不明白为什么它没有显示正确的值。但是,如果我使状态为无符号长整数,那么我会得到正确的值。

所以我很困惑。如果char只保存一个字节,为什么char不能将字节显示为十六进制值?

1 个答案:

答案 0 :(得分:3)

cout专门用于输出char类型作为字符,而不是数字。这也适用于未签名的字符。你可以通过转换为unsigned int来解决这个问题。

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