前言

最近在调试的时候使用 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_tunsigned 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_tunsigned char 的别名,使用 cout 进行打印会按照 char 类型打印

如果想要打印数字可以在前面加上正号(+),或者强制类型转换为 int

参考