C++ cout打印uint8_t的正确方式

问题现象

编译运行以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*************************************************************************
> 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;
}

编译

1
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 类型
使用一元运算符+(和- 运算符对应)
测试代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*************************************************************************
> 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)

Donate
0%