前言
最近在调试的时候使用 cout
打印 uint8_t
类型数据,结果却什么都没有打印出来,一直以为程序有问题,调试了半天发现 cout
会使用 char
类型来打印 uint8_t
。
打印
1
2
3
4
5
6
7
8
|
#include<iostream>
int main(int argc, char *argv[])
{
uint8_t num = 1;
std::cout << "num is: " << num << std::endl;
return 0;
}
|
结果如下所示,什么都没有
num is:
我们从源码中看下为啥
1
2
3
4
5
6
|
template<class _Traits>
basic_ostream<char, _Traits>&
operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c)
{
return _VSTD::__put_character_sequence(__os, (char *) &__c, 1);
}
|
这里发现重载的 <<
操作符中的第二个参数的类型是 unsigned char
类型,为什么不是 uint8_t
呢?
再次从源码中找答案
1
|
typedef unsigned char uint8_t;
|
原来 uint8_t
是 unsigned char
的别名,其实都是一样的。
到这里就能解释的通,为什么使用 cout
打印值为 1 类型为 uint8_t
看不到输出了,因为在 ACSII
中小于32的都是控制字符,打印是没有效果的。
所以如果 uint8_t
的值为49那么打印出来的就是数字1了
1
2
3
4
5
6
7
8
|
#include<iostream>
int main(int argc, char *argv[])
{
uint8_t num = 49;
std::cout << "num is: " << num << std::endl;
return 0;
}
|
结果如下所示,符合我们的预期
num is: 1
如何以数字的形式打印
上面分析了为什么以 uint8_t
打印没有输出的原因,那么如何按数字打印?
我们很容易就想到强制类型转换
1
2
3
4
5
6
7
8
|
#include<iostream>
int main(int argc, char *argv[])
{
uint8_t num = 1;
std::cout << "num is: " << (int)num << std::endl;
return 0;
}
|
结果如下
num is: 1
除了强制类型转换,还有一种更简单的办法就是在前面加上正号(+)
1
2
3
4
5
6
7
8
|
#include<iostream>
int main(int argc, char *argv[])
{
uint8_t num = 1;
std::cout << "num is: " << +num << std::endl;
return 0;
}
|
num is: 1
总结
uint8_t
是 unsigned char
的别名,使用 cout
进行打印会按照 char
类型打印
如果想要打印数字可以在前面加上正号(+),或者强制类型转换为 int
参考