c++中的细节问题

问题现象

编译运行以下代码

/*************************************************************************
    > File Name: cout_uint8.cpp
    > Author: ce39906
    > Mail: ce39906@163.com
    > Created Time: 2018-06-29 13:50:53
 ************************************************************************/
#include <cstdint>
#include <iostream>

int main()
{
    std::uint8_t uint8_num = 10;
    std::cout << "uint8_t num is " << uint8_num << std::endl;
    return 0;
}

编译

g++ cout_uint8.cpp --std=c++11 -o cout_uint8

运行得到的输出如下
avatar
cout没有正确打印数字10
产生这种情况的原因是很多c++ 实现中 uint8_tunsigned chartypedef。因此cout 实际调用的函数是 ostream& operator<<(ostream&, unsigned char) ,因此实际的执行结果是打印对应的ASCII 码字符,而其字符是不可以打印的。

解决方案

uint8_t 转化为unsigned 类型
使用一元运算符**+(和-** 运算符对应)
测试代码如下

/*************************************************************************
    > File Name: cout_uint8.cpp
    > Author: ce39906
    > Mail: ce39906@163.com
    > Created Time: 2018-06-29 13:50:53
 ************************************************************************/
#include <cstdint>
#include <iostream>
#include <typeinfo>

int main()
{
    std::uint8_t uint8_num = 10;
    std::cout << "uint8_t num is " << uint8_num << std::endl;
    std::cout << "after cast to unsigned, uint8_t num is " << unsigned(uint8_num) << std::endl;
    std::cout << "with a unary + operator, uint8_t num is " << +uint8_num << std::endl;
    std::cout << "type of '+uint8_num' is " << typeid(+uint8_num).name() << std::endl;
    return 0;
}

运行结果如下
avatar
可见使用+运算符的原理也是进行类型转换(把uint8_t 转为 int)