问题现象
编译运行以下代码
/*************************************************************************
> 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)
本文探讨了在C++中使用uint8_t类型变量时,直接通过cout打印可能遇到的问题及原因。由于某些C++实现将uint8_t视为unsigned char,这会导致打印ASCII码而非数字。文章提供了两种解决方案:一是显式类型转换为unsigned,二是使用一元+运算符。
4764

被折叠的 条评论
为什么被折叠?



