考虑这个简单的C ++程序:
#include <cstdint>
#include <iostream>
int main() {
uint8_t var;
std::cin >> var;
std::cout << "var = " << var << '\n';
if (var == 1) {
std::cout << "var is 1\n";
} else {
std::cout << "var is not 1\n";
}
}
运行它显示出一些令人惊讶的行为。当输入为1
时,the output is
var = 1
var is not 1
这显然是荒谬的!经过许多不同的测试后,我意识到发生了什么事情it's reading and writing a char
!仍然不是我想要的行为–我使用了char
,因为我想要uint8_t
eger行为。 在执行流I / O时如何使int
表现得与其他整数类型一样?或者,我应该使用哪种单字节类型?
您需要转换为uint8_t
:
int
或更短时间(C风格):
std::cout << "var = " << static_cast<int>(var) << '\n';
或更短的时间(使用算术运算符提升为std::cout << "var = " << (int)var << '\n';
:]
int
在执行流I / O时如何使uint8_t表现得与其他整数类型一样?
您不能。 std::cout << "var = " << +var << '\n';
可以。
如果Apparently是std::uint8_t
的别名,通常(也许总是),则它是一种字符类型,标准流将其视为字符类型。
您可以在将其插入流之前将其转换为非字符整数类型:
unsigned char
或带有中间变量:
std::cout << "var = " << static_cast<unsigned>(var) << '\n';
流提取仅适用于中间变量方法:
unsigned temp = var;
std::cout << "var = " << temp << '\n';
在相关说明中,如果您希望输出变量的地址,则unsigned temp;
std::cin >> temp;
var = temp;
将不起作用,因为它将被视为以null终止的字符串...该字符串不是,因此导致未定义行为。为此,您可以使用std::cout << &var;
。