C++ cout打印uint8_t的正确方式
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
运行得到的输出如下
cout没有正确打印数字10
产生这种情况的原因是很多c++ 实现中 uint8_t 是 unsigned char 的 typedef。因此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;
}
运行结果如下
可见使用+运算符的原理也是进行类型转换(把uint8_t 转为 int)