关于在C++中使用整数,我有一个奇怪的问题.
我写了一个简单的程序,它将一个值设置为一个变量然后打印它,但它没有按预期工作.
我的程序只有两行代码:
uint8_t aa = 5;
cout << "value is " << aa << endl;
Run Code Online (Sandbox Code Playgroud)
这个程序的输出是 value is
即,它打印为空白aa.
当我改变uint8_t到uint16_t上面的代码就像一个魅力.
我使用64位的Ubuntu 12.04(精确穿山甲),我的编译器版本是:
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
Run Code Online (Sandbox Code Playgroud)
πάν*_*ῥεῖ 136
它实际上并不打印空白,但很可能是值为5的ASCII字符,它是不可打印的(或不可见的).有许多不可见的ASCII字符代码,其中大多数低于值32,实际上是空白.
您必须转换aa为unsigned int输出数值,因为ostream& operator<<(ostream&, unsigned char)尝试输出可见字符值.
uint8_t aa=5;
cout << "value is " << unsigned(aa) << endl;
Run Code Online (Sandbox Code Playgroud)
arn*_*rne 44
uint8_t将最有可能成为一个typedef对unsigned char.所述ostream类具有特殊的过载unsigned char,即,其将打印带5号,这是不可打印的,因此,空的空间的字符.
Sri*_*tha 27
在任何原始数据类型的变量之前添加一元+运算符将给出可打印的数值而不是ASCII字符(在char类型的情况下).
uint8_t aa=5;
cout<<"value is "<< +aa <<endl;
Run Code Online (Sandbox Code Playgroud)
pep*_*ico 14
使用ADL(依赖于参数的名称查找):
#include <cstdint>
#include <iostream>
#include <typeinfo>
namespace numerical_chars {
inline std::ostream &operator<<(std::ostream &os, char c) {
return std::is_signed<char>::value ? os << static_cast<int>(c)
: os << static_cast<unsigned int>(c);
}
inline std::ostream &operator<<(std::ostream &os, signed char c) {
return os << static_cast<int>(c);
}
inline std::ostream &operator<<(std::ostream &os, unsigned char c) {
return os << static_cast<unsigned int>(c);
}
}
int main() {
using namespace std;
uint8_t i = 42;
{
cout << i << endl;
}
{
using namespace numerical_chars;
cout << i << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
*
42
Run Code Online (Sandbox Code Playgroud)自定义流操纵器也是可能的.
cout << +i << endl).和operator<<()之间的重载是一个非成员函数。您可以显式地使用成员函数将 a (或 a )视为。std::ostreamcharcharuint8_tint
#include <iostream>
#include <cstddef>
int main()
{
uint8_t aa=5;
std::cout << "value is ";
std::cout.operator<<(aa);
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
value is 5
Run Code Online (Sandbox Code Playgroud)