我写了一个简单的程序,它将一个值设置为一个变量,然后打印它,但它并没有像预期的那样工作。我的程序只有两行代码:
uint8_t a = 5;
cout << "value is " << a << endl;
这个程序的输出是value is
,也就是说,它为a
打印空白。
当我将uint8_t
更改为uint16_t
时,上面的代码就像魔法一样工作。
我使用Ubuntu 12.04(Precise Pangolin),64位,我的编译器版本是:
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
8条答案
按热度按时间wh6knrhe1#
它实际上不会打印空白,但最有可能的是值为5的ASCII字符,这是不可打印的(或不可见的)。这里有很多invisible ASCII character codes,大多数都在值32以下,这实际上是空白的。
您必须将
aa
转换为unsigned int
以输出数值,因为ostream& operator<<(ostream&, unsigned char)
尝试输出可见字符值。yhived7q2#
在任何基元数据类型的变量之前添加一元+运算符将产生可打印的数值,而不是ASCII字符(对于char类型)。
这是因为
+a
会导致a
升级为int
。cgh8pdjw3#
uint8_t
很可能是unsigned char
的typedef
。ostream
类为unsigned char
提供了一个特殊的重载,即它打印带有数字5的字符,这是不可打印的,因此是空白的。ovfsdjhp4#
输出:
cout << +i << endl
)。disbfnqx5#
这是因为输出操作符将
uint8_t
视为char
(uint8_t
通常只是unsigned char
的别名),因此它使用ASCII代码(这是最常见的字符编码系统)5
打印字符。例如,参见this reference。
gojuced76#
cout
将aa
视为ASCII值5
的char
,这是一个不可打印的字符,请尝试在打印前将其类型转换为int
。c6ubokkw7#
std::ostream
和char
之间的operator<<()
重载是非成员函数。可以显式使用成员函数将char
(或uint8_t
)视为int
。输出:
bejyjqdl8#
正如其他人之前所说,出现问题是因为标准流将有符号字符和无符号字符视为单个字符而不是数字。
以下是我的解决方案,代码更改最少:
添加
"+0"
对任何数字都是安全的,包括浮点数。对于整数类型,如果
sizeof(aa) < sizeof(int)
,则将结果类型更改为int
。如果sizeof(aa) >= sizeof(int)
,则不会更改类型。这个解决方案也很适合准备
int8_t
打印到流,而其他一些解决方案不是那么好:输出:
pepper_chico和πάντα ε给出的ADL解决方案真的很漂亮。