摘要:我期待的代码:cout << uint8_t(0);
来打印"0",但它不打印任何内容。
详细版本:当我尝试将uint8_t
对象流传输到cout
时,我用gcc得到了奇怪的字符。这是预期的行为吗?uint8_t
会不会是某个基于char
的类型的别名?请参阅代码示例中的编译器/系统注解。
// compile and run with:
// g++ test-uint8.cpp -std=c++11 && ./a.out
// -std=c++0x (for older gcc versions)
/**
* prints out the following with compiler:
* gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)
* on the system:
* Linux 3.7.9-101.fc17.x86_64
* Note that the first print statement uses an unset uint8_t
* and therefore the behaviour is undefined. (Included here for
* completeness)
> g++ test-uint8.cpp -std=c++11 && ./a.out
>>>�<<< >>>194<<<
>>><<< >>>0<<<
>>><<< >>>0<<<
>>><<< >>>0<<<
>>><<< >>>1<<<
>>><<< >>>2<<<
*
**/
#include <cstdint>
#include <iostream>
void print(const uint8_t& n)
{
std::cout << ">>>" << n << "<<< "
<< ">>>" << (unsigned int)(n) << "<<<\n";
}
int main()
{
uint8_t a;
uint8_t b(0);
uint8_t c = 0;
uint8_t d{0};
uint8_t e = 1;
uint8_t f = 2;
for (auto i : {a,b,c,d,e,f})
{
print(i);
}
}
3条答案
按热度按时间prdp8dxp1#
uint8_t
是unsigned char
的别名,iostream有特殊的char重载,用于打印字符而不是格式化数字。转换为整数会禁止此操作。
w46czmvw2#
uint8_t可能是某个基于字符的类型的别名吗?
当然可以。如果内置的8位无符号整型类型存在,它必须是typedef。因为只有两种可能的8位无符号整型类型,
char
(编译器将其视为无符号整型)和unsigned char
,它必须是其中之一。除非在char
大于8位的系统上,在这种情况下它将不存在。ao218c7q3#
正如其他人所指出的,
uint8_t
被作为unsigned char
进行流传输。我有时会使用来自整型类型的位字段,它们 * 被 * 作为整型进行流传输,以避免强制转换或重载operator<<
,但只有在不浪费空间的情况下,如下面的Pos结构体:输出: