霸气的铅笔 · NuGet Error NU1101 | ...· 2 月前 · |
高大的眼镜 · 数字孪生国际研究中心-北航国际前沿交叉科学研究院· 4 月前 · |
完美的油条 · Makefile所有内嵌函数-阿里云开发者社区· 1 年前 · |
坐怀不乱的大葱 · 用js实现增加一行、删除一行,添加序号,而且 ...· 1 年前 · |
忐忑的啄木鸟 · C++ 指针 | 菜鸟教程· 1 年前 · |
我有一个关于在C++中处理整数的奇怪问题。
我编写了一个简单的程序,将一个值设置为一个变量,然后打印出来,但它并没有像预期的那样工作。
我的程序只有两行代码:
uint8_t aa = 5;
cout << "value is " << aa << endl;
这个程序的输出是
value is
也就是说,它为
aa
打印空白。
当我将
uint8_t
更改为
uint16_t
时,上面的代码非常出色。
我使用的是Ubuntu 12.04(精确穿山甲),64位,我的编译器版本是:
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
它实际上并不打印空白,但很可能是值为5的ASCII字符,它是不可打印的(或不可见的)。有许多 invisible ASCII character codes ,其中大多数低于值32,这实际上是空白。
您必须将
aa
转换为
unsigned int
才能输出数值,因为
ostream& operator<<(ostream&, unsigned char)
会尝试输出可见字符值。
uint8_t aa=5;
cout << "value is " << unsigned(aa) << endl;
这是因为输出操作符将
uint8_t
视为
char
(
uint8_t
通常只是
unsigned char
的别名),所以它使用ASCII码(这是最常见的字符编码系统)
5
打印字符。
例如,参见 this reference 。
正如其他人之前所说的,之所以会出现这个问题,是因为标准流将有符号字符和无符号字符视为单个字符而不是数字。
以下是我的解决方案,只需最少的代码更改:
uint8_t aa = 5;
cout << "value is " << aa + 0 << endl;
对于包括浮点在内的任何数字,添加
"+0"
都是安全的。
对于整数类型,如果为
sizeof(aa) < sizeof(int)
,它会将结果类型更改为
int
。如果为
sizeof(aa) >= sizeof(int)
,则不会更改类型。
这个解决方案对于准备要打印成流的
int8_t
也很好,而其他一些解决方案就不那么好了:
int8_t aa = -120;
cout << "value is " << aa + 0 << endl;
cout << "bad value is " << unsigned(aa) << endl;
输出:
value is -120
bad value is 4294967176
附注:由pepper_chico和πάνταῥεῖ提供的ADL解决方案非常漂亮。
std::ostream
和
char
之间的
operator<<()
重载是一个非成员函数。您可以显式地使用成员函数将
char
(或
uint8_t
)视为
int
。
#include <iostream>
#include <cstddef>
int main()
uint8_t aa=5;
高大的眼镜 · 数字孪生国际研究中心-北航国际前沿交叉科学研究院 4 月前 |
完美的油条 · Makefile所有内嵌函数-阿里云开发者社区 1 年前 |
忐忑的啄木鸟 · C++ 指针 | 菜鸟教程 1 年前 |