打印的无符号字符为十六进制太长

时间:2015-02-26 02:05:55

标签: c++ c++11

让我们假设我有一个非常简单的例子:

vector<unsigned char> bytes {0xFF, 0xFF, 0xFD};

for (const char & v: bytes) {
    cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(v) <<" ";
}

cout << endl;

这给出了:

FFFFFFFF FFFFFFFF FFFFFFFD

但是,我希望简短,例如:

FF FF FD

那么为什么我会得到一些额外的“FFFFF”?

3 个答案:

答案 0 :(得分:3)

如果您在循环中保持char无符号,则会得到所需的结果:

for (const unsigned char & v: bytes) {
    //     ^^^^^^^^
    cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(v) <<" ";
}

autoauto&也可以使用,因为向量元素是无符号的。

您获得FF的原因是系统上的char 已签名,这意味着这些值会在转换为整数时进行符号扩展。

Demo.

答案 1 :(得分:3)

for (const char & v: bytes)

您隐式将bytes中的每个元素转换为char,在您的平台上似乎是signed。然后,当您转向unsigned时,char会进行符号扩展,最终会出现大的十六进制值。

将以上内容更改为以下

之一
for (const unsigned char & v: bytes)
for (auto const& v: bytes)
for (auto v: bytes) // since it's only a char copying might be better

Live demo

答案 2 :(得分:0)

正如其他人所说,这是因为您将元素转换为已签名的字符。我更喜欢以这种方式使用for循环来防止这样的错误:

vector<unsigned char> bytes{ 0xFF, 0xFF, 0xFD };

for (int i = 0; i < bytes.size(); i++) {
    cout << hex << setfill('0') << setw(2) << uppercase << static_cast<unsigned>(bytes[i]) << " ";
}

使用迭代器也是一个好主意。