使用IO机械手以十六进制打印8位数字

时间:2019-02-19 16:13:01

标签: c++

我有一个uint8_t,并希望以与格式字符串%02x相同的方式将其转换为C ++中的两位十六进制字符串。

为此,我邀请了stringstream和IO操纵器来配置流应如何格式化数字:

#include <iomanip>
#include <iostream>
#include <sstream>

int main()
{
    uint8_t x = 3;
    std::cout << std::hex << std::setw(2) << std::setfill('0')
              << x << std::endl;
    return 0;
}

所以这应该打印03对吗?不,它会打印0

2 个答案:

答案 0 :(得分:2)

实际上,它会打印0\0x03。是的,它将变量x解释为字符而不是数字。

正确的方法是使用一元加号运算符:

std::cout << std::hex << std::setw(2) << std::setfill('0')
          << +x << std::endl;

答案 1 :(得分:2)

您的<cstdint>的标准库实现(顺便说一下……您没有包括它,并且uint8_t在命名空间std中)对uint8_t使用typedef :

namespace std {
    // ...
    typedef char unsigned `uint8_t`
    // ...
};

因此std::ostream将其解释为字符,而不是整数类型。要确保将其解释为整数,只需将其显式转换:

#include <cstdint>
#include <iomanip>
#include <iostream>

int main()
{
    std::uint8_t x{ 3 };
    std::cout << std::hex << std::setw(2) << std::setfill('0')
              << static_cast<int>(x) << '\n';
}